summaryrefslogtreecommitdiff
path: root/procps/top.c
diff options
context:
space:
mode:
authorDenys Vlasenko2018-03-07 04:47:52 +0100
committerDenys Vlasenko2018-03-07 04:47:52 +0100
commita2cae937d026d70f5014b95498b08251f73d39eb (patch)
tree28a743e515dab5fca103f24697aa49e0814e2dec /procps/top.c
parent75e56a3db9c1415dac1a3d83a12f694930897a8c (diff)
downloadbusybox-a2cae937d026d70f5014b95498b08251f73d39eb.zip
busybox-a2cae937d026d70f5014b95498b08251f73d39eb.tar.gz
top: much faster cursor key navigation by avoiding process rescan
function old new delta handle_input 549 560 +11 top_main 889 891 +2 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'procps/top.c')
-rw-r--r--procps/top.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/procps/top.c b/procps/top.c
index fc05662..075c96c 100644
--- a/procps/top.c
+++ b/procps/top.c
@@ -896,7 +896,8 @@ enum {
| PSSCAN_PID
| PSSCAN_SMAPS
| PSSCAN_COMM,
- EXIT_MASK = (unsigned)-1,
+ EXIT_MASK = 0,
+ NO_RESCAN_MASK = (unsigned)-1,
};
#if ENABLE_FEATURE_TOP_INTERACTIVE
@@ -934,7 +935,7 @@ static unsigned handle_input(unsigned scan_mask, unsigned interval)
}
if (c == KEYCODE_HOME) {
G_scroll_ofs = 0;
- break;
+ goto normalize_ofs;
}
if (c == KEYCODE_END) {
G_scroll_ofs = ntop - G.lines / 2;
@@ -951,7 +952,7 @@ static unsigned handle_input(unsigned scan_mask, unsigned interval)
G_scroll_ofs = ntop - 1;
if (G_scroll_ofs < 0)
G_scroll_ofs = 0;
- break;
+ return NO_RESCAN_MASK;
}
c |= 0x20; /* lowercase */
@@ -1156,6 +1157,7 @@ int top_main(int argc UNUSED_PARAM, char **argv)
#endif
while (scan_mask != EXIT_MASK) {
+ unsigned new_mask;
procps_status_t *p = NULL;
if (OPT_BATCH_MODE) {
@@ -1233,21 +1235,32 @@ int top_main(int argc UNUSED_PARAM, char **argv)
#else
qsort(top, ntop, sizeof(top_status_t), (void*)(sort_function[0]));
#endif
- display_process_list(G.lines, col);
}
#if ENABLE_FEATURE_TOPMEM
else { /* TOPMEM */
qsort(topmem, ntop, sizeof(topmem_status_t), (void*)topmem_sort);
+ }
+#endif
+ IF_FEATURE_TOP_INTERACTIVE(display:)
+ IF_FEATURE_TOPMEM(if (scan_mask != TOPMEM_MASK)) {
+ display_process_list(G.lines, col);
+ }
+#if ENABLE_FEATURE_TOPMEM
+ else { /* TOPMEM */
display_topmem_process_list(G.lines, col);
}
#endif
- clearmems();
if (iterations >= 0 && !--iterations)
break;
#if !ENABLE_FEATURE_TOP_INTERACTIVE
+ clearmems();
sleep(interval);
#else
- scan_mask = handle_input(scan_mask, interval);
+ new_mask = handle_input(scan_mask, interval);
+ if (new_mask == NO_RESCAN_MASK)
+ goto display;
+ scan_mask = new_mask;
+ clearmems();
#endif
} /* end of "while (not Q)" */