From: Namhyung Kim <namhyung....@lge.com> Show group members' overhead also when showing the leader's if event group is enabled. Use macro for defining hpp functions which looks almost identical.
Cc: Jiri Olsa <jo...@redhat.com> Cc: Stephane Eranian <eran...@google.com> Cc: Pekka Enberg <penb...@kernel.org> Signed-off-by: Namhyung Kim <namhy...@kernel.org> --- tools/perf/ui/gtk/browser.c | 87 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 70 insertions(+), 17 deletions(-) diff --git a/tools/perf/ui/gtk/browser.c b/tools/perf/ui/gtk/browser.c index 253b6219a39e..04ed0cbbc090 100644 --- a/tools/perf/ui/gtk/browser.c +++ b/tools/perf/ui/gtk/browser.c @@ -45,30 +45,82 @@ static const char *perf_gtk__get_percent_color(double percent) return NULL; } -#define HPP__COLOR_FN(_name, _field) \ -static int perf_gtk__hpp_color_ ## _name(struct perf_hpp *hpp, \ - struct hist_entry *he) \ +static int perf_gtk__percent_color_snprintf(char *buf, size_t size, + double percent) +{ + int ret = 0; + const char *markup; + + markup = perf_gtk__get_percent_color(percent); + if (markup) + ret += scnprintf(buf, size, markup); + + ret += scnprintf(buf + ret, size - ret, "%6.2f%%", percent); + + if (markup) + ret += scnprintf(buf + ret, size - ret, "</span>"); + + return ret; +} + + +#define __HPP_COLOR_PERCENT_FN(_type, _field) \ +static int perf_gtk__hpp_color_##_type(struct perf_hpp *hpp, \ + struct hist_entry *he) \ { \ + int ret; \ + double percent = 0.0; \ struct hists *hists = he->hists; \ - double percent = 100.0 * he->stat._field / hists->stats.total_period; \ - const char *markup; \ - int ret = 0; \ \ - markup = perf_gtk__get_percent_color(percent); \ - if (markup) \ - ret += scnprintf(hpp->buf, hpp->size, "%s", markup); \ - ret += scnprintf(hpp->buf + ret, hpp->size - ret, "%6.2f%%", percent); \ - if (markup) \ - ret += scnprintf(hpp->buf + ret, hpp->size - ret, "</span>"); \ + if (hists->stats.total_period) \ + percent = 100.0 * he->stat._field / hists->stats.total_period; \ + \ + ret = perf_gtk__percent_color_snprintf(hpp->buf, hpp->size, percent); \ + \ + if (symbol_conf.event_group) { \ + int i; \ + struct perf_evsel *evsel = hists_to_evsel(hists); \ + struct hist_entry *pair; \ + int nr_members = evsel->nr_members; \ + double *percents; \ + \ + if (nr_members <= 1) \ + return ret; \ + \ + percents = zalloc(sizeof(*percents) * nr_members); \ + if (percents == NULL) { \ + pr_warning("Not enough memory!\n"); \ + return ret; \ + } \ + \ + list_for_each_entry(pair, &he->pairs.head, pairs.node) { \ + u64 period = pair->stat._field; \ + u64 total = pair->hists->stats.total_period; \ + \ + if (!total) \ + continue; \ + \ + evsel = hists_to_evsel(pair->hists); \ + i = perf_evsel__group_idx(evsel); \ + percents[i] = 100.0 * period / total; \ + } \ \ + for (i = 1; i < nr_members; i++) { \ + ret += scnprintf(hpp->buf + ret, hpp->size -ret, " "); \ + ret += perf_gtk__percent_color_snprintf(hpp->buf + ret, \ + hpp->size - ret,\ + percents[i]); \ + } \ + free(percents); \ + } \ return ret; \ } -HPP__COLOR_FN(overhead, period) -HPP__COLOR_FN(overhead_sys, period_sys) -HPP__COLOR_FN(overhead_us, period_us) -HPP__COLOR_FN(overhead_guest_sys, period_guest_sys) -HPP__COLOR_FN(overhead_guest_us, period_guest_us) +__HPP_COLOR_PERCENT_FN(overhead, period) +__HPP_COLOR_PERCENT_FN(overhead_sys, period_sys) +__HPP_COLOR_PERCENT_FN(overhead_us, period_us) +__HPP_COLOR_PERCENT_FN(overhead_guest_sys, period_guest_sys) +__HPP_COLOR_PERCENT_FN(overhead_guest_us, period_guest_us) #undef HPP__COLOR_FN @@ -103,6 +155,7 @@ static void perf_gtk__show_hists(GtkWidget *window, struct hists *hists) struct perf_hpp hpp = { .buf = s, .size = sizeof(s), + .ptr = hists_to_evsel(hists), }; nr_cols = 0; -- 1.7.11.7 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/