diff options
Diffstat (limited to 'tools/perf/util/newt.c')
-rw-r--r-- | tools/perf/util/newt.c | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/tools/perf/util/newt.c b/tools/perf/util/newt.c index ba6acd04c082..e74df1240ef6 100644 --- a/tools/perf/util/newt.c +++ b/tools/perf/util/newt.c | |||
@@ -9,6 +9,7 @@ | |||
9 | 9 | ||
10 | #include "cache.h" | 10 | #include "cache.h" |
11 | #include "hist.h" | 11 | #include "hist.h" |
12 | #include "pstack.h" | ||
12 | #include "session.h" | 13 | #include "session.h" |
13 | #include "sort.h" | 14 | #include "sort.h" |
14 | #include "symbol.h" | 15 | #include "symbol.h" |
@@ -680,16 +681,18 @@ static int hist_browser__populate(struct hist_browser *self, struct hists *hists | |||
680 | struct ui_progress *progress; | 681 | struct ui_progress *progress; |
681 | struct rb_node *nd; | 682 | struct rb_node *nd; |
682 | u64 curr_hist = 0; | 683 | u64 curr_hist = 0; |
683 | char seq[] = "."; | 684 | char seq[] = ".", unit; |
684 | char str[256]; | 685 | char str[256]; |
686 | unsigned long nr_events = hists->stats.nr_events[PERF_RECORD_SAMPLE]; | ||
685 | 687 | ||
686 | if (self->form) { | 688 | if (self->form) { |
687 | newtFormDestroy(self->form); | 689 | newtFormDestroy(self->form); |
688 | newtPopWindow(); | 690 | newtPopWindow(); |
689 | } | 691 | } |
690 | 692 | ||
691 | snprintf(str, sizeof(str), "Samples: %Ld ", | 693 | nr_events = convert_unit(nr_events, &unit); |
692 | hists->stats.total); | 694 | snprintf(str, sizeof(str), "Events: %lu%c ", |
695 | nr_events, unit); | ||
693 | newtDrawRootText(0, 0, str); | 696 | newtDrawRootText(0, 0, str); |
694 | 697 | ||
695 | newtGetScreenSize(NULL, &rows); | 698 | newtGetScreenSize(NULL, &rows); |
@@ -718,12 +721,12 @@ static int hist_browser__populate(struct hist_browser *self, struct hists *hists | |||
718 | if (h->filtered) | 721 | if (h->filtered) |
719 | continue; | 722 | continue; |
720 | 723 | ||
721 | len = hist_entry__append_browser(h, self->tree, hists->stats.total); | 724 | len = hist_entry__append_browser(h, self->tree, hists->stats.total_period); |
722 | if (len > max_len) | 725 | if (len > max_len) |
723 | max_len = len; | 726 | max_len = len; |
724 | if (symbol_conf.use_callchain) | 727 | if (symbol_conf.use_callchain) |
725 | hist_entry__append_callchain_browser(h, self->tree, | 728 | hist_entry__append_callchain_browser(h, self->tree, |
726 | hists->stats.total, idx++); | 729 | hists->stats.total_period, idx++); |
727 | ++curr_hist; | 730 | ++curr_hist; |
728 | if (curr_hist % 5) | 731 | if (curr_hist % 5) |
729 | ui_progress__update(progress, curr_hist); | 732 | ui_progress__update(progress, curr_hist); |
@@ -748,6 +751,7 @@ static int hist_browser__populate(struct hist_browser *self, struct hists *hists | |||
748 | newtFormAddHotKey(self->form, 'A'); | 751 | newtFormAddHotKey(self->form, 'A'); |
749 | newtFormAddHotKey(self->form, 'a'); | 752 | newtFormAddHotKey(self->form, 'a'); |
750 | newtFormAddHotKey(self->form, NEWT_KEY_RIGHT); | 753 | newtFormAddHotKey(self->form, NEWT_KEY_RIGHT); |
754 | newtFormAddHotKey(self->form, NEWT_KEY_LEFT); | ||
751 | newtFormAddComponents(self->form, self->tree, NULL); | 755 | newtFormAddComponents(self->form, self->tree, NULL); |
752 | self->selection = newt__symbol_tree_get_current(self->tree); | 756 | self->selection = newt__symbol_tree_get_current(self->tree); |
753 | 757 | ||
@@ -799,6 +803,7 @@ static int hist_browser__title(char *bf, size_t size, const char *input_name, | |||
799 | int hists__browse(struct hists *self, const char *helpline, const char *input_name) | 803 | int hists__browse(struct hists *self, const char *helpline, const char *input_name) |
800 | { | 804 | { |
801 | struct hist_browser *browser = hist_browser__new(); | 805 | struct hist_browser *browser = hist_browser__new(); |
806 | struct pstack *fstack = pstack__new(2); | ||
802 | const struct thread *thread_filter = NULL; | 807 | const struct thread *thread_filter = NULL; |
803 | const struct dso *dso_filter = NULL; | 808 | const struct dso *dso_filter = NULL; |
804 | struct newtExitStruct es; | 809 | struct newtExitStruct es; |
@@ -808,12 +813,16 @@ int hists__browse(struct hists *self, const char *helpline, const char *input_na | |||
808 | if (browser == NULL) | 813 | if (browser == NULL) |
809 | return -1; | 814 | return -1; |
810 | 815 | ||
816 | fstack = pstack__new(2); | ||
817 | if (fstack == NULL) | ||
818 | goto out; | ||
819 | |||
811 | ui_helpline__push(helpline); | 820 | ui_helpline__push(helpline); |
812 | 821 | ||
813 | hist_browser__title(msg, sizeof(msg), input_name, | 822 | hist_browser__title(msg, sizeof(msg), input_name, |
814 | dso_filter, thread_filter); | 823 | dso_filter, thread_filter); |
815 | if (hist_browser__populate(browser, self, msg) < 0) | 824 | if (hist_browser__populate(browser, self, msg) < 0) |
816 | goto out; | 825 | goto out_free_stack; |
817 | 826 | ||
818 | while (1) { | 827 | while (1) { |
819 | const struct thread *thread; | 828 | const struct thread *thread; |
@@ -834,6 +843,19 @@ int hists__browse(struct hists *self, const char *helpline, const char *input_na | |||
834 | else | 843 | else |
835 | continue; | 844 | continue; |
836 | } | 845 | } |
846 | |||
847 | if (es.u.key == NEWT_KEY_LEFT) { | ||
848 | const void *top; | ||
849 | |||
850 | if (pstack__empty(fstack)) | ||
851 | continue; | ||
852 | top = pstack__pop(fstack); | ||
853 | if (top == &dso_filter) | ||
854 | goto zoom_out_dso; | ||
855 | if (top == &thread_filter) | ||
856 | goto zoom_out_thread; | ||
857 | continue; | ||
858 | } | ||
837 | } | 859 | } |
838 | 860 | ||
839 | if (browser->selection->sym != NULL && | 861 | if (browser->selection->sym != NULL && |
@@ -886,12 +908,15 @@ do_annotate: | |||
886 | hist_entry__annotate_browser(he); | 908 | hist_entry__annotate_browser(he); |
887 | } else if (choice == zoom_dso) { | 909 | } else if (choice == zoom_dso) { |
888 | if (dso_filter) { | 910 | if (dso_filter) { |
911 | pstack__remove(fstack, &dso_filter); | ||
912 | zoom_out_dso: | ||
889 | ui_helpline__pop(); | 913 | ui_helpline__pop(); |
890 | dso_filter = NULL; | 914 | dso_filter = NULL; |
891 | } else { | 915 | } else { |
892 | ui_helpline__fpush("To zoom out press -> + \"Zoom out of %s DSO\"", | 916 | ui_helpline__fpush("To zoom out press <- or -> + \"Zoom out of %s DSO\"", |
893 | dso->kernel ? "the Kernel" : dso->short_name); | 917 | dso->kernel ? "the Kernel" : dso->short_name); |
894 | dso_filter = dso; | 918 | dso_filter = dso; |
919 | pstack__push(fstack, &dso_filter); | ||
895 | } | 920 | } |
896 | hists__filter_by_dso(self, dso_filter); | 921 | hists__filter_by_dso(self, dso_filter); |
897 | hist_browser__title(msg, sizeof(msg), input_name, | 922 | hist_browser__title(msg, sizeof(msg), input_name, |
@@ -900,13 +925,16 @@ do_annotate: | |||
900 | goto out; | 925 | goto out; |
901 | } else if (choice == zoom_thread) { | 926 | } else if (choice == zoom_thread) { |
902 | if (thread_filter) { | 927 | if (thread_filter) { |
928 | pstack__remove(fstack, &thread_filter); | ||
929 | zoom_out_thread: | ||
903 | ui_helpline__pop(); | 930 | ui_helpline__pop(); |
904 | thread_filter = NULL; | 931 | thread_filter = NULL; |
905 | } else { | 932 | } else { |
906 | ui_helpline__fpush("To zoom out press -> + \"Zoom out of %s(%d) thread\"", | 933 | ui_helpline__fpush("To zoom out press <- or -> + \"Zoom out of %s(%d) thread\"", |
907 | thread->comm_set ? thread->comm : "", | 934 | thread->comm_set ? thread->comm : "", |
908 | thread->pid); | 935 | thread->pid); |
909 | thread_filter = thread; | 936 | thread_filter = thread; |
937 | pstack__push(fstack, &thread_filter); | ||
910 | } | 938 | } |
911 | hists__filter_by_thread(self, thread_filter); | 939 | hists__filter_by_thread(self, thread_filter); |
912 | hist_browser__title(msg, sizeof(msg), input_name, | 940 | hist_browser__title(msg, sizeof(msg), input_name, |
@@ -916,6 +944,8 @@ do_annotate: | |||
916 | } | 944 | } |
917 | } | 945 | } |
918 | err = 0; | 946 | err = 0; |
947 | out_free_stack: | ||
948 | pstack__delete(fstack); | ||
919 | out: | 949 | out: |
920 | hist_browser__delete(browser); | 950 | hist_browser__delete(browser); |
921 | return err; | 951 | return err; |