summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/perf/builtin-top.c108
1 files changed, 73 insertions, 35 deletions
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index 4eef3465e837..7de28ce9ca26 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -595,25 +595,84 @@ out_free:
free(buf);
}
-static void print_known_keys(void)
+static void print_mapped_keys(void)
{
- fprintf(stdout, "\nknown keys:\n");
- fprintf(stdout, "\t[d] select display delay.\n");
- fprintf(stdout, "\t[e] select display entries (lines).\n");
- fprintf(stdout, "\t[E] active event counter. \t(%s)\n", event_name(sym_counter));
- fprintf(stdout, "\t[f] select normal display count filter.\n");
- fprintf(stdout, "\t[F] select annotation display count filter (percentage).\n");
- fprintf(stdout, "\t[qQ] quit.\n");
- fprintf(stdout, "\t[s] select annotation symbol and start annotation.\n");
- fprintf(stdout, "\t[S] stop annotation, revert to normal display.\n");
- fprintf(stdout, "\t[w] toggle display weighted/count[E]r. \t(%d)\n", display_weighted ? 1 : 0);
+ char *name = NULL;
+
+ if (sym_filter_entry) {
+ struct symbol *sym = (struct symbol *)(sym_filter_entry+1);
+ name = sym->name;
+ }
+
+ fprintf(stdout, "\nMapped keys:\n");
+ fprintf(stdout, "\t[d] display refresh delay. \t(%d)\n", delay_secs);
+ fprintf(stdout, "\t[e] display entries (lines). \t(%d)\n", print_entries);
+
+ if (nr_counters > 1)
+ fprintf(stdout, "\t[E] active event counter. \t(%s)\n", event_name(sym_counter));
+
+ fprintf(stdout, "\t[f] profile display filter (count). \t(%d)\n", count_filter);
+
+ if (vmlinux) {
+ fprintf(stdout, "\t[F] annotate display filter (percent). \t(%d%%)\n", sym_pcnt_filter);
+ fprintf(stdout, "\t[s] annotate symbol. \t(%s)\n", name?: "NULL");
+ fprintf(stdout, "\t[S] stop annotation.\n");
+ }
+
+ if (nr_counters > 1)
+ fprintf(stdout, "\t[w] toggle display weighted/count[E]r. \t(%d)\n", display_weighted ? 1 : 0);
+
fprintf(stdout, "\t[z] toggle sample zeroing. \t(%d)\n", zero ? 1 : 0);
+ fprintf(stdout, "\t[qQ] quit.\n");
+}
+
+static int key_mapped(int c)
+{
+ switch (c) {
+ case 'd':
+ case 'e':
+ case 'f':
+ case 'z':
+ case 'q':
+ case 'Q':
+ return 1;
+ case 'E':
+ case 'w':
+ return nr_counters > 1 ? 1 : 0;
+ case 'F':
+ case 's':
+ case 'S':
+ return vmlinux ? 1 : 0;
+ }
+
+ return 0;
}
static void handle_keypress(int c)
{
- int once = 0;
-repeat:
+ if (!key_mapped(c)) {
+ struct pollfd stdin_poll = { .fd = 0, .events = POLLIN };
+ struct termios tc, save;
+
+ print_mapped_keys();
+ fprintf(stdout, "\nEnter selection, or unmapped key to continue: ");
+ fflush(stdout);
+
+ tcgetattr(0, &save);
+ tc = save;
+ tc.c_lflag &= ~(ICANON | ECHO);
+ tc.c_cc[VMIN] = 0;
+ tc.c_cc[VTIME] = 0;
+ tcsetattr(0, TCSANOW, &tc);
+
+ poll(&stdin_poll, 1, -1);
+ c = getc(stdin);
+
+ tcsetattr(0, TCSAFLUSH, &save);
+ if (!key_mapped(c))
+ return;
+ }
+
switch (c) {
case 'd':
prompt_integer(&delay_secs, "Enter display delay");
@@ -669,28 +728,6 @@ repeat:
case 'z':
zero = ~zero;
break;
- default: {
- struct pollfd stdin_poll = { .fd = 0, .events = POLLIN };
- struct termios tc, save;
-
- if (!once) {
- print_known_keys();
- once++;
- }
-
- tcgetattr(0, &save);
- tc = save;
- tc.c_lflag &= ~(ICANON | ECHO);
- tc.c_cc[VMIN] = 0;
- tc.c_cc[VTIME] = 0;
- tcsetattr(0, TCSANOW, &tc);
-
- poll(&stdin_poll, 1, -1);
- c = getc(stdin);
-
- tcsetattr(0, TCSAFLUSH, &save);
- goto repeat;
- }
}
}
@@ -705,6 +742,7 @@ static void *display_thread(void *arg __used)
tc.c_lflag &= ~(ICANON | ECHO);
tc.c_cc[VMIN] = 0;
tc.c_cc[VTIME] = 0;
+
repeat:
delay_msecs = delay_secs * 1000;
tcsetattr(0, TCSANOW, &tc);