diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/builtin-top.c | 108 |
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: | |||
595 | free(buf); | 595 | free(buf); |
596 | } | 596 | } |
597 | 597 | ||
598 | static void print_known_keys(void) | 598 | static void print_mapped_keys(void) |
599 | { | 599 | { |
600 | fprintf(stdout, "\nknown keys:\n"); | 600 | char *name = NULL; |
601 | fprintf(stdout, "\t[d] select display delay.\n"); | 601 | |
602 | fprintf(stdout, "\t[e] select display entries (lines).\n"); | 602 | if (sym_filter_entry) { |
603 | fprintf(stdout, "\t[E] active event counter. \t(%s)\n", event_name(sym_counter)); | 603 | struct symbol *sym = (struct symbol *)(sym_filter_entry+1); |
604 | fprintf(stdout, "\t[f] select normal display count filter.\n"); | 604 | name = sym->name; |
605 | fprintf(stdout, "\t[F] select annotation display count filter (percentage).\n"); | 605 | } |
606 | fprintf(stdout, "\t[qQ] quit.\n"); | 606 | |
607 | fprintf(stdout, "\t[s] select annotation symbol and start annotation.\n"); | 607 | fprintf(stdout, "\nMapped keys:\n"); |
608 | fprintf(stdout, "\t[S] stop annotation, revert to normal display.\n"); | 608 | fprintf(stdout, "\t[d] display refresh delay. \t(%d)\n", delay_secs); |
609 | fprintf(stdout, "\t[w] toggle display weighted/count[E]r. \t(%d)\n", display_weighted ? 1 : 0); | 609 | fprintf(stdout, "\t[e] display entries (lines). \t(%d)\n", print_entries); |
610 | |||
611 | if (nr_counters > 1) | ||
612 | fprintf(stdout, "\t[E] active event counter. \t(%s)\n", event_name(sym_counter)); | ||
613 | |||
614 | fprintf(stdout, "\t[f] profile display filter (count). \t(%d)\n", count_filter); | ||
615 | |||
616 | if (vmlinux) { | ||
617 | fprintf(stdout, "\t[F] annotate display filter (percent). \t(%d%%)\n", sym_pcnt_filter); | ||
618 | fprintf(stdout, "\t[s] annotate symbol. \t(%s)\n", name?: "NULL"); | ||
619 | fprintf(stdout, "\t[S] stop annotation.\n"); | ||
620 | } | ||
621 | |||
622 | if (nr_counters > 1) | ||
623 | fprintf(stdout, "\t[w] toggle display weighted/count[E]r. \t(%d)\n", display_weighted ? 1 : 0); | ||
624 | |||
610 | fprintf(stdout, "\t[z] toggle sample zeroing. \t(%d)\n", zero ? 1 : 0); | 625 | fprintf(stdout, "\t[z] toggle sample zeroing. \t(%d)\n", zero ? 1 : 0); |
626 | fprintf(stdout, "\t[qQ] quit.\n"); | ||
627 | } | ||
628 | |||
629 | static int key_mapped(int c) | ||
630 | { | ||
631 | switch (c) { | ||
632 | case 'd': | ||
633 | case 'e': | ||
634 | case 'f': | ||
635 | case 'z': | ||
636 | case 'q': | ||
637 | case 'Q': | ||
638 | return 1; | ||
639 | case 'E': | ||
640 | case 'w': | ||
641 | return nr_counters > 1 ? 1 : 0; | ||
642 | case 'F': | ||
643 | case 's': | ||
644 | case 'S': | ||
645 | return vmlinux ? 1 : 0; | ||
646 | } | ||
647 | |||
648 | return 0; | ||
611 | } | 649 | } |
612 | 650 | ||
613 | static void handle_keypress(int c) | 651 | static void handle_keypress(int c) |
614 | { | 652 | { |
615 | int once = 0; | 653 | if (!key_mapped(c)) { |
616 | repeat: | 654 | struct pollfd stdin_poll = { .fd = 0, .events = POLLIN }; |
655 | struct termios tc, save; | ||
656 | |||
657 | print_mapped_keys(); | ||
658 | fprintf(stdout, "\nEnter selection, or unmapped key to continue: "); | ||
659 | fflush(stdout); | ||
660 | |||
661 | tcgetattr(0, &save); | ||
662 | tc = save; | ||
663 | tc.c_lflag &= ~(ICANON | ECHO); | ||
664 | tc.c_cc[VMIN] = 0; | ||
665 | tc.c_cc[VTIME] = 0; | ||
666 | tcsetattr(0, TCSANOW, &tc); | ||
667 | |||
668 | poll(&stdin_poll, 1, -1); | ||
669 | c = getc(stdin); | ||
670 | |||
671 | tcsetattr(0, TCSAFLUSH, &save); | ||
672 | if (!key_mapped(c)) | ||
673 | return; | ||
674 | } | ||
675 | |||
617 | switch (c) { | 676 | switch (c) { |
618 | case 'd': | 677 | case 'd': |
619 | prompt_integer(&delay_secs, "Enter display delay"); | 678 | prompt_integer(&delay_secs, "Enter display delay"); |
@@ -669,28 +728,6 @@ repeat: | |||
669 | case 'z': | 728 | case 'z': |
670 | zero = ~zero; | 729 | zero = ~zero; |
671 | break; | 730 | break; |
672 | default: { | ||
673 | struct pollfd stdin_poll = { .fd = 0, .events = POLLIN }; | ||
674 | struct termios tc, save; | ||
675 | |||
676 | if (!once) { | ||
677 | print_known_keys(); | ||
678 | once++; | ||
679 | } | ||
680 | |||
681 | tcgetattr(0, &save); | ||
682 | tc = save; | ||
683 | tc.c_lflag &= ~(ICANON | ECHO); | ||
684 | tc.c_cc[VMIN] = 0; | ||
685 | tc.c_cc[VTIME] = 0; | ||
686 | tcsetattr(0, TCSANOW, &tc); | ||
687 | |||
688 | poll(&stdin_poll, 1, -1); | ||
689 | c = getc(stdin); | ||
690 | |||
691 | tcsetattr(0, TCSAFLUSH, &save); | ||
692 | goto repeat; | ||
693 | } | ||
694 | } | 731 | } |
695 | } | 732 | } |
696 | 733 | ||
@@ -705,6 +742,7 @@ static void *display_thread(void *arg __used) | |||
705 | tc.c_lflag &= ~(ICANON | ECHO); | 742 | tc.c_lflag &= ~(ICANON | ECHO); |
706 | tc.c_cc[VMIN] = 0; | 743 | tc.c_cc[VMIN] = 0; |
707 | tc.c_cc[VTIME] = 0; | 744 | tc.c_cc[VTIME] = 0; |
745 | |||
708 | repeat: | 746 | repeat: |
709 | delay_msecs = delay_secs * 1000; | 747 | delay_msecs = delay_secs * 1000; |
710 | tcsetattr(0, TCSANOW, &tc); | 748 | tcsetattr(0, TCSANOW, &tc); |