aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-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:
595 free(buf); 595 free(buf);
596} 596}
597 597
598static void print_known_keys(void) 598static 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
629static 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
613static void handle_keypress(int c) 651static void handle_keypress(int c)
614{ 652{
615 int once = 0; 653 if (!key_mapped(c)) {
616repeat: 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
708repeat: 746repeat:
709 delay_msecs = delay_secs * 1000; 747 delay_msecs = delay_secs * 1000;
710 tcsetattr(0, TCSANOW, &tc); 748 tcsetattr(0, TCSANOW, &tc);