[PATCH 08/17] perf hists browser: Fix context menu item

From: Namhyung Kim
Date: Sat Jan 16 2016 - 11:08:00 EST


When symbol sort key is not given, it doesn't show any item other than
exit. Check sort key to select possible items. Also check items more
strictly using sort key information.

Signed-off-by: Namhyung Kim <namhyung@xxxxxxxxxx>
---
tools/perf/ui/browsers/hists.c | 50 ++++++++++++++++++++++++------------------
tools/perf/util/sort.c | 3 +++
tools/perf/util/sort.h | 2 ++
3 files changed, 34 insertions(+), 21 deletions(-)

diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index 08c09ad755d2..cd6349ebd0d6 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -2263,10 +2263,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
continue;
}

- if (!sort__has_sym)
- goto add_exit_option;
-
- if (browser->selection == NULL)
+ if (!sort__has_sym || browser->selection == NULL)
goto skip_annotation;

if (sort__mode == SORT_MODE__BRANCH) {
@@ -2294,23 +2291,33 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
browser->selection->sym);
}
skip_annotation:
- nr_options += add_thread_opt(browser, &actions[nr_options],
- &options[nr_options], thread);
- nr_options += add_dso_opt(browser, &actions[nr_options],
- &options[nr_options], map);
- nr_options += add_map_opt(browser, &actions[nr_options],
- &options[nr_options],
- browser->selection ?
- browser->selection->map : NULL);
- nr_options += add_socket_opt(browser, &actions[nr_options],
- &options[nr_options],
- socked_id);
+ if (sort__has_thread) {
+ nr_options += add_thread_opt(browser, &actions[nr_options],
+ &options[nr_options], thread);
+ }
+ if (sort__has_dso) {
+ nr_options += add_dso_opt(browser, &actions[nr_options],
+ &options[nr_options], map);
+ nr_options += add_map_opt(browser, &actions[nr_options],
+ &options[nr_options],
+ browser->selection ?
+ browser->selection->map : NULL);
+ }
+ if (sort__has_socket) {
+ nr_options += add_socket_opt(browser, &actions[nr_options],
+ &options[nr_options],
+ socked_id);
+ }
+
/* perf script support */
if (browser->he_selection) {
- nr_options += add_script_opt(browser,
- &actions[nr_options],
- &options[nr_options],
- thread, NULL);
+ if (sort__has_thread) {
+ nr_options += add_script_opt(browser,
+ &actions[nr_options],
+ &options[nr_options],
+ thread, NULL);
+ }
+
/*
* Note that browser->selection != NULL
* when browser->he_selection is not NULL,
@@ -2320,16 +2327,17 @@ skip_annotation:
*
* See hist_browser__show_entry.
*/
- nr_options += add_script_opt(browser,
+ if (sort__has_sym && browser->selection->sym) {
+ nr_options += add_script_opt(browser,
&actions[nr_options],
&options[nr_options],
NULL, browser->selection->sym);
+ }
}
nr_options += add_script_opt(browser, &actions[nr_options],
&options[nr_options], NULL, NULL);
nr_options += add_switch_opt(browser, &actions[nr_options],
&options[nr_options]);
-add_exit_option:
nr_options += add_exit_opt(browser, &actions[nr_options],
&options[nr_options]);

diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index 4632475bc5e4..8ff873ee39a8 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -21,6 +21,7 @@ const char *field_order;
regex_t ignore_callees_regex;
int have_ignore_callees = 0;
int sort__need_collapse = 0;
+int sort__has_thread = 0;
int sort__has_parent = 0;
int sort__has_sym = 0;
int sort__has_dso = 0;
@@ -2249,6 +2250,8 @@ static int sort_dimension__add(const char *tok,
sort__has_dso = 1;
} else if (sd->entry == &sort_socket) {
sort__has_socket = 1;
+ } else if (sd->entry == &sort_comm || sd->entry == &sort_thread) {
+ sort__has_thread = 1;
}

return __sort_dimension__add(sd);
diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h
index 051739615847..879513e61dba 100644
--- a/tools/perf/util/sort.h
+++ b/tools/perf/util/sort.h
@@ -32,7 +32,9 @@ extern const char default_sort_order[];
extern regex_t ignore_callees_regex;
extern int have_ignore_callees;
extern int sort__need_collapse;
+extern int sort__has_thread;
extern int sort__has_parent;
+extern int sort__has_dso;
extern int sort__has_sym;
extern int sort__has_socket;
extern enum sort_mode sort__mode;
--
2.6.4