perf report: Use hierarchy hpp list on gtk
authorNamhyung Kim <namhyung@kernel.org>
Mon, 7 Mar 2016 19:44:51 +0000 (16:44 -0300)
committerIngo Molnar <mingo@kernel.org>
Tue, 8 Mar 2016 09:11:21 +0000 (10:11 +0100)
Now hpp formats are linked using perf_hpp_list_node when hierarchy is
enabled.  Like in stdio, use this info to print entries with multiple
sort keys in a single hierarchy properly.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/1457361308-514-8-git-send-email-namhyung@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
tools/perf/ui/gtk/hists.c

index 4534e2d..bd9bf7e 100644 (file)
@@ -407,7 +407,9 @@ static void perf_gtk__add_hierarchy_entries(struct hists *hists,
        struct rb_node *node;
        struct hist_entry *he;
        struct perf_hpp_fmt *fmt;
+       struct perf_hpp_list_node *fmt_node;
        u64 total = hists__total_period(hists);
+       int size;
 
        for (node = rb_first(root); node; node = rb_next(node)) {
                GtkTreeIter iter;
@@ -425,11 +427,11 @@ static void perf_gtk__add_hierarchy_entries(struct hists *hists,
                gtk_tree_store_append(store, &iter, parent);
 
                col_idx = 0;
-               hists__for_each_format(hists, fmt) {
-                       if (perf_hpp__is_sort_entry(fmt) ||
-                           perf_hpp__is_dynamic_entry(fmt))
-                               break;
 
+               /* the first hpp_list_node is for overhead columns */
+               fmt_node = list_first_entry(&hists->hpp_formats,
+                                           struct perf_hpp_list_node, list);
+               perf_hpp_list__for_each_format(&fmt_node->hpp, fmt) {
                        if (fmt->color)
                                fmt->color(fmt, hpp, he);
                        else
@@ -439,6 +441,7 @@ static void perf_gtk__add_hierarchy_entries(struct hists *hists,
                }
 
                bf = hpp->buf;
+               size = hpp->size;
                perf_hpp_list__for_each_format(he->hpp_list, fmt) {
                        int ret;
 
@@ -451,9 +454,12 @@ static void perf_gtk__add_hierarchy_entries(struct hists *hists,
                        advance_hpp(hpp, ret + 2);
                }
 
-               gtk_tree_store_set(store, &iter, col_idx, rtrim(bf), -1);
+               gtk_tree_store_set(store, &iter, col_idx, ltrim(rtrim(bf)), -1);
 
                if (!he->leaf) {
+                       hpp->buf = bf;
+                       hpp->size = size;
+
                        perf_gtk__add_hierarchy_entries(hists, &he->hroot_out,
                                                        store, &iter, hpp,
                                                        min_pcnt);
@@ -486,6 +492,7 @@ static void perf_gtk__show_hierarchy(GtkWidget *window, struct hists *hists,
                                     float min_pcnt)
 {
        struct perf_hpp_fmt *fmt;
+       struct perf_hpp_list_node *fmt_node;
        GType col_types[MAX_COLUMNS];
        GtkCellRenderer *renderer;
        GtkTreeStore *store;
@@ -494,7 +501,7 @@ static void perf_gtk__show_hierarchy(GtkWidget *window, struct hists *hists,
        int nr_cols = 0;
        char s[512];
        char buf[512];
-       bool first = true;
+       bool first_node, first_col;
        struct perf_hpp hpp = {
                .buf            = s,
                .size           = sizeof(s),
@@ -514,11 +521,11 @@ static void perf_gtk__show_hierarchy(GtkWidget *window, struct hists *hists,
        renderer = gtk_cell_renderer_text_new();
 
        col_idx = 0;
-       hists__for_each_format(hists, fmt) {
-               if (perf_hpp__is_sort_entry(fmt) ||
-                   perf_hpp__is_dynamic_entry(fmt))
-                       break;
 
+       /* the first hpp_list_node is for overhead columns */
+       fmt_node = list_first_entry(&hists->hpp_formats,
+                                   struct perf_hpp_list_node, list);
+       perf_hpp_list__for_each_format(&fmt_node->hpp, fmt) {
                gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
                                                            -1, fmt->name,
                                                            renderer, "markup",
@@ -527,20 +534,24 @@ static void perf_gtk__show_hierarchy(GtkWidget *window, struct hists *hists,
 
        /* construct merged column header since sort keys share single column */
        buf[0] = '\0';
-       hists__for_each_format(hists ,fmt) {
-               if (!perf_hpp__is_sort_entry(fmt) &&
-                   !perf_hpp__is_dynamic_entry(fmt))
-                       continue;
-               if (perf_hpp__should_skip(fmt, hists))
-                       continue;
-
-               if (first)
-                       first = false;
-               else
+       first_node = true;
+       list_for_each_entry_continue(fmt_node, &hists->hpp_formats, list) {
+               if (!first_node)
                        strcat(buf, " / ");
+               first_node = false;
 
-               fmt->header(fmt, &hpp, hists_to_evsel(hists));
-               strcat(buf, rtrim(hpp.buf));
+               first_col = true;
+               perf_hpp_list__for_each_format(&fmt_node->hpp ,fmt) {
+                       if (perf_hpp__should_skip(fmt, hists))
+                               continue;
+
+                       if (!first_col)
+                               strcat(buf, "+");
+                       first_col = false;
+
+                       fmt->header(fmt, &hpp, hists_to_evsel(hists));
+                       strcat(buf, ltrim(rtrim(hpp.buf)));
+               }
        }
 
        gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),