top: improve response time to keyboard input

function                                             old     new   delta
handle_input                                         674     708     +34
top_main                                            1019    1047     +28
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 62/0)               Total: 62 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2025-08-05 04:29:07 +02:00
parent 3aa2bee269
commit 58b2353baa

View file

@ -968,7 +968,7 @@ enum {
| PSSCAN_SMAPS
| PSSCAN_COMM,
EXIT_MASK = 0,
NO_RESCAN_MASK = (unsigned)-1,
ONLY_REDRAW = (unsigned)-1,
};
#if ENABLE_FEATURE_TOP_INTERACTIVE
@ -984,12 +984,19 @@ static unsigned handle_input(unsigned scan_mask, duration_t interval)
int32_t c, cc;
c = safe_read_key(STDIN_FILENO, G.kbd_input, interval * 1000);
if (c == -1 && errno != EAGAIN) {
/* error/EOF */
option_mask32 |= OPT_EOF;
if (c == -1) {
if (errno != EAGAIN)
/* error/EOF */
option_mask32 |= OPT_EOF;
/* else: timeout - rescan and refresh */
break;
}
interval = 0;
/* "continue" statements below return to do one additional
* quick attempt to read a key. This prevents
* long sequence of e.g. "nnnnnnnnnnnnnnnnnnnnnnnnnn"
* to cause lots of rescans.
*/
if (c == initial_settings.c_cc[VINTR])
return EXIT_MASK;
@ -1023,7 +1030,7 @@ static unsigned handle_input(unsigned scan_mask, duration_t interval)
G_scroll_ofs = ntop - 1;
if (G_scroll_ofs < 0)
G_scroll_ofs = 0;
return NO_RESCAN_MASK;
return ONLY_REDRAW;
}
cc = c;
@ -1083,7 +1090,7 @@ static unsigned handle_input(unsigned scan_mask, duration_t interval)
if (c == 's') {
sort_field = (sort_field + 1) % NUM_SORT_FIELD;
if (scan_mask == TOPMEM_MASK)
return NO_RESCAN_MASK;
return ONLY_REDRAW;
scan_mask = TOPMEM_MASK;
free(prev_hist);
prev_hist = NULL;
@ -1093,7 +1100,7 @@ static unsigned handle_input(unsigned scan_mask, duration_t interval)
# endif
if (c == 'r') {
inverted ^= 1;
continue;
return ONLY_REDRAW;
}
# if ENABLE_FEATURE_TOP_SMP_CPU
/* procps-2.0.18 uses 'C', 3.2.7 uses '1' */
@ -1115,8 +1122,8 @@ static unsigned handle_input(unsigned scan_mask, duration_t interval)
}
# endif
# endif
break; /* unknown key -> force refresh */
}
/* Unknown key. Eat remaining buffered input (if any) */
} /* while (1) */
return scan_mask;
}
@ -1253,7 +1260,7 @@ int top_main(int argc UNUSED_PARAM, char **argv)
#endif
while (scan_mask != EXIT_MASK) {
IF_FEATURE_TOP_INTERACTIVE(unsigned new_mask;)
IF_FEATURE_TOP_INTERACTIVE(unsigned new_mask = scan_mask;)
procps_status_t *p = NULL;
if (OPT_BATCH_MODE) {
@ -1337,7 +1344,7 @@ int top_main(int argc UNUSED_PARAM, char **argv)
qsort(topmem, ntop, sizeof(topmem_status_t), (void*)topmem_sort);
}
#endif
IF_FEATURE_TOP_INTERACTIVE(display:)
IF_FEATURE_TOP_INTERACTIVE(redraw:)
IF_FEATURE_TOPMEM(if (scan_mask != TOPMEM_MASK)) {
display_process_list(G.lines, col);
}
@ -1353,9 +1360,15 @@ int top_main(int argc UNUSED_PARAM, char **argv)
clearmems();
sleep_for_duration(interval);
#else
new_mask = handle_input(scan_mask, interval);
if (new_mask == NO_RESCAN_MASK)
goto display;
new_mask = handle_input(scan_mask,
/* After "redraw with no rescan", have one
* key timeout shorter that normal
* (IOW: rescan sooner):
*/
(new_mask == ONLY_REDRAW ? 1 : interval)
);
if (new_mask == ONLY_REDRAW)
goto redraw;
scan_mask = new_mask;
clearmems();
#endif