diff options
Diffstat (limited to 'tools/perf/ui/browsers/hists.c')
-rw-r--r-- | tools/perf/ui/browsers/hists.c | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index d7112dfa89cc..167f7701f94e 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c | |||
@@ -1695,8 +1695,19 @@ out: | |||
1695 | return key; | 1695 | return key; |
1696 | } | 1696 | } |
1697 | 1697 | ||
1698 | static bool filter_group_entries(struct ui_browser *self __maybe_unused, | ||
1699 | void *entry) | ||
1700 | { | ||
1701 | struct perf_evsel *evsel = list_entry(entry, struct perf_evsel, node); | ||
1702 | |||
1703 | if (symbol_conf.event_group && !perf_evsel__is_group_leader(evsel)) | ||
1704 | return true; | ||
1705 | |||
1706 | return false; | ||
1707 | } | ||
1708 | |||
1698 | static int __perf_evlist__tui_browse_hists(struct perf_evlist *evlist, | 1709 | static int __perf_evlist__tui_browse_hists(struct perf_evlist *evlist, |
1699 | const char *help, | 1710 | int nr_entries, const char *help, |
1700 | struct hist_browser_timer *hbt, | 1711 | struct hist_browser_timer *hbt, |
1701 | struct perf_session_env *env) | 1712 | struct perf_session_env *env) |
1702 | { | 1713 | { |
@@ -1707,7 +1718,8 @@ static int __perf_evlist__tui_browse_hists(struct perf_evlist *evlist, | |||
1707 | .refresh = ui_browser__list_head_refresh, | 1718 | .refresh = ui_browser__list_head_refresh, |
1708 | .seek = ui_browser__list_head_seek, | 1719 | .seek = ui_browser__list_head_seek, |
1709 | .write = perf_evsel_menu__write, | 1720 | .write = perf_evsel_menu__write, |
1710 | .nr_entries = evlist->nr_entries, | 1721 | .filter = filter_group_entries, |
1722 | .nr_entries = nr_entries, | ||
1711 | .priv = evlist, | 1723 | .priv = evlist, |
1712 | }, | 1724 | }, |
1713 | .env = env, | 1725 | .env = env, |
@@ -1723,20 +1735,37 @@ static int __perf_evlist__tui_browse_hists(struct perf_evlist *evlist, | |||
1723 | menu.b.width = line_len; | 1735 | menu.b.width = line_len; |
1724 | } | 1736 | } |
1725 | 1737 | ||
1726 | return perf_evsel_menu__run(&menu, evlist->nr_entries, help, hbt); | 1738 | return perf_evsel_menu__run(&menu, nr_entries, help, hbt); |
1727 | } | 1739 | } |
1728 | 1740 | ||
1729 | int perf_evlist__tui_browse_hists(struct perf_evlist *evlist, const char *help, | 1741 | int perf_evlist__tui_browse_hists(struct perf_evlist *evlist, const char *help, |
1730 | struct hist_browser_timer *hbt, | 1742 | struct hist_browser_timer *hbt, |
1731 | struct perf_session_env *env) | 1743 | struct perf_session_env *env) |
1732 | { | 1744 | { |
1733 | if (evlist->nr_entries == 1) { | 1745 | int nr_entries = evlist->nr_entries; |
1746 | |||
1747 | single_entry: | ||
1748 | if (nr_entries == 1) { | ||
1734 | struct perf_evsel *first = list_entry(evlist->entries.next, | 1749 | struct perf_evsel *first = list_entry(evlist->entries.next, |
1735 | struct perf_evsel, node); | 1750 | struct perf_evsel, node); |
1736 | const char *ev_name = perf_evsel__name(first); | 1751 | const char *ev_name = perf_evsel__name(first); |
1737 | return perf_evsel__hists_browse(first, evlist->nr_entries, help, | 1752 | |
1753 | return perf_evsel__hists_browse(first, nr_entries, help, | ||
1738 | ev_name, false, hbt, env); | 1754 | ev_name, false, hbt, env); |
1739 | } | 1755 | } |
1740 | 1756 | ||
1741 | return __perf_evlist__tui_browse_hists(evlist, help, hbt, env); | 1757 | if (symbol_conf.event_group) { |
1758 | struct perf_evsel *pos; | ||
1759 | |||
1760 | nr_entries = 0; | ||
1761 | list_for_each_entry(pos, &evlist->entries, node) | ||
1762 | if (perf_evsel__is_group_leader(pos)) | ||
1763 | nr_entries++; | ||
1764 | |||
1765 | if (nr_entries == 1) | ||
1766 | goto single_entry; | ||
1767 | } | ||
1768 | |||
1769 | return __perf_evlist__tui_browse_hists(evlist, nr_entries, help, | ||
1770 | hbt, env); | ||
1742 | } | 1771 | } |