diff options
Diffstat (limited to 'tools/perf/util/block-info.c')
-rw-r--r-- | tools/perf/util/block-info.c | 74 |
1 files changed, 73 insertions, 1 deletions
diff --git a/tools/perf/util/block-info.c b/tools/perf/util/block-info.c index 597d1205fa6c..9abc201ebe63 100644 --- a/tools/perf/util/block-info.c +++ b/tools/perf/util/block-info.c @@ -10,6 +10,7 @@ #include "map.h" #include "srcline.h" #include "evlist.h" +#include "ui/browsers/hists.h" static struct block_header_column { const char *name; @@ -438,9 +439,75 @@ struct block_report *block_info__create_report(struct evlist *evlist, return block_reports; } +#ifdef HAVE_SLANG_SUPPORT +static int block_hists_browser__title(struct hist_browser *browser, char *bf, + size_t size) +{ + struct hists *hists = evsel__hists(browser->block_evsel); + const char *evname = perf_evsel__name(browser->block_evsel); + unsigned long nr_samples = hists->stats.nr_events[PERF_RECORD_SAMPLE]; + int ret; + + ret = scnprintf(bf, size, "# Samples: %lu", nr_samples); + if (evname) + scnprintf(bf + ret, size - ret, " of event '%s'", evname); + + return 0; +} + +static int block_hists_tui_browse(struct block_hist *bh, struct evsel *evsel, + float min_percent) +{ + struct hists *hists = &bh->block_hists; + struct hist_browser *browser; + int key = -1; + static const char help[] = + " q Quit \n"; + + browser = hist_browser__new(hists); + if (!browser) + return -1; + + browser->block_evsel = evsel; + browser->title = block_hists_browser__title; + browser->min_pcnt = min_percent; + + /* reset abort key so that it can get Ctrl-C as a key */ + SLang_reset_tty(); + SLang_init_tty(0, 0, 0); + + while (1) { + key = hist_browser__run(browser, "? - help", true); + + switch (key) { + case 'q': + goto out; + case '?': + ui_browser__help_window(&browser->b, help); + break; + default: + break; + } + } + +out: + hist_browser__delete(browser); + return 0; +} +#else +static int block_hists_tui_browse(struct block_hist *bh __maybe_unused, + struct evsel *evsel __maybe_unused, + float min_percent __maybe_unused) +{ + return 0; +} +#endif + int report__browse_block_hists(struct block_hist *bh, float min_percent, - struct evsel *evsel __maybe_unused) + struct evsel *evsel) { + int ret; + switch (use_browser) { case 0: symbol_conf.report_individual_block = true; @@ -448,6 +515,11 @@ int report__browse_block_hists(struct block_hist *bh, float min_percent, stdout, true); hists__delete_entries(&bh->block_hists); return 0; + case 1: + symbol_conf.report_individual_block = true; + ret = block_hists_tui_browse(bh, evsel, min_percent); + hists__delete_entries(&bh->block_hists); + return ret; default: return -1; } |