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

From: Arnaldo Carvalho de Melo
Date: Wed Jan 20 2016 - 19:52:56 EST


Em Sun, Jan 17, 2016 at 01:03:08AM +0900, Namhyung Kim escreveu:
> 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.

So, without this patch when I press enter on 'perf top' I can zoom into
threads, with it I lose that option.

- Arnaldo

> 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