top: crash on resize fixed -- thanks Michal Maruska #320289
This commit is contained in:
parent
3ced977cf2
commit
73030f7346
1
NEWS
1
NEWS
@ -9,6 +9,7 @@ top: fix %CPU max on 2..9 CPU SMP -- thanks Ga*tan LEURENT rh110555
|
|||||||
ps: fix crash related to realloc -- thanks David Houlder
|
ps: fix crash related to realloc -- thanks David Houlder
|
||||||
ps: man page more detailed #334682
|
ps: man page more detailed #334682
|
||||||
spelling fixes #300333 #334684 #334685
|
spelling fixes #300333 #334684 #334685
|
||||||
|
top: crash on resize fixed -- thanks Michal Maruska #320289
|
||||||
|
|
||||||
procps-3.2.4 --> procps-3.2.5
|
procps-3.2.4 --> procps-3.2.5
|
||||||
|
|
||||||
|
29
top.c
29
top.c
@ -90,6 +90,8 @@ static char Msg_delayed [SMLBUFSIZ];
|
|||||||
static int Msg_awaiting = 0;
|
static int Msg_awaiting = 0;
|
||||||
|
|
||||||
// This is the select() timeout. Clear it in sig handlers to avoid a race.
|
// This is the select() timeout. Clear it in sig handlers to avoid a race.
|
||||||
|
// (signal happens just as we are about to select() and thus does not
|
||||||
|
// break us out of the select(), causing us to delay until timeout)
|
||||||
static volatile struct timeval tv;
|
static volatile struct timeval tv;
|
||||||
#define ZAP_TIMEOUT do{tv.tv_usec=0; tv.tv_sec=0;}while(0);
|
#define ZAP_TIMEOUT do{tv.tv_usec=0; tv.tv_sec=0;}while(0);
|
||||||
|
|
||||||
@ -2349,17 +2351,25 @@ static void wins_reflag (int what, int flg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// using a flag to avoid other code seeing inconsistant state
|
||||||
|
static volatile int need_resize;
|
||||||
|
static void wins_resize_sighandler (int dont_care_sig)
|
||||||
|
{
|
||||||
|
(void)dont_care_sig;
|
||||||
|
need_resize = 1;
|
||||||
|
ZAP_TIMEOUT
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Set the screen dimensions and arrange for the real workhorse.
|
// Set the screen dimensions and arrange for the real workhorse.
|
||||||
// (also) catches:
|
// (also) catches:
|
||||||
// SIGWINCH and SIGCONT
|
// SIGWINCH and SIGCONT
|
||||||
static void wins_resize (int dont_care_sig)
|
static void wins_resize (void)
|
||||||
{
|
{
|
||||||
struct winsize wz;
|
struct winsize wz;
|
||||||
char *env_columns; // Unix98 environment variable COLUMNS
|
char *env_columns; // Unix98 environment variable COLUMNS
|
||||||
char *env_lines; // Unix98 environment variable LINES
|
char *env_lines; // Unix98 environment variable LINES
|
||||||
|
|
||||||
(void)dont_care_sig;
|
|
||||||
|
|
||||||
Screen_cols = columns; // <term.h>
|
Screen_cols = columns; // <term.h>
|
||||||
Screen_rows = lines; // <term.h>
|
Screen_rows = lines; // <term.h>
|
||||||
|
|
||||||
@ -2403,7 +2413,6 @@ static void wins_resize (int dont_care_sig)
|
|||||||
|
|
||||||
// force rebuild of column headers AND libproc/readproc requirements
|
// force rebuild of column headers AND libproc/readproc requirements
|
||||||
Frames_libflags = 0;
|
Frames_libflags = 0;
|
||||||
ZAP_TIMEOUT
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2451,7 +2460,7 @@ static void windows_stage2 (void)
|
|||||||
capsmk(&Winstk[i]);
|
capsmk(&Winstk[i]);
|
||||||
}
|
}
|
||||||
// rely on this next guy to force a call (eventually) to reframewins
|
// rely on this next guy to force a call (eventually) to reframewins
|
||||||
wins_resize(0);
|
wins_resize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2483,7 +2492,7 @@ static void do_key (unsigned c)
|
|||||||
|
|
||||||
case 'A':
|
case 'A':
|
||||||
Rc.mode_altscr = !Rc.mode_altscr;
|
Rc.mode_altscr = !Rc.mode_altscr;
|
||||||
wins_resize(0);
|
wins_resize();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'b':
|
case 'b':
|
||||||
@ -3318,10 +3327,14 @@ int main (int dont_care_argc, char *argv[])
|
|||||||
signal(SIGTSTP, suspend);
|
signal(SIGTSTP, suspend);
|
||||||
signal(SIGTTIN, suspend);
|
signal(SIGTTIN, suspend);
|
||||||
signal(SIGTTOU, suspend);
|
signal(SIGTTOU, suspend);
|
||||||
signal(SIGCONT, wins_resize);
|
signal(SIGCONT, wins_resize_sighandler);
|
||||||
signal(SIGWINCH, wins_resize);
|
signal(SIGWINCH, wins_resize_sighandler);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
if (need_resize){
|
||||||
|
need_resize = 0;
|
||||||
|
wins_resize();
|
||||||
|
}
|
||||||
frame_make();
|
frame_make();
|
||||||
|
|
||||||
if (Msg_awaiting) show_msg(Msg_delayed);
|
if (Msg_awaiting) show_msg(Msg_delayed);
|
||||||
|
Loading…
Reference in New Issue
Block a user