Commit-ID:  2c6caff2b26fde8f3f87183f8c97f2cebfdbcb98
Gitweb:     http://git.kernel.org/tip/2c6caff2b26fde8f3f87183f8c97f2cebfdbcb98
Author:     Namhyung Kim <namhy...@kernel.org>
AuthorDate: Mon, 9 Nov 2015 14:45:46 +0900
Committer:  Arnaldo Carvalho de Melo <a...@redhat.com>
CommitDate: Thu, 19 Nov 2015 13:19:26 -0300

perf ui/gtk: Support folded callchains

The folded callchain mode is to print all chains in a single line.
Currently perf report --gtk doesn't support folded callchains.  Like
flat callchains, only leaf nodes are added to the final rbtree so it
should show entries in parent nodes.

Signed-off-by: Namhyung Kim <namhy...@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <a...@redhat.com>
Tested-by: Brendan Gregg <brendan.d.gr...@gmail.com>
Cc: Andi Kleen <a...@firstfloor.org>
Cc: David Ahern <dsah...@gmail.com>
Cc: Frederic Weisbecker <fweis...@gmail.com>
Cc: Jiri Olsa <jo...@redhat.com>
Cc: Kan Liang <kan.li...@intel.com>
Cc: Pekka Enberg <penb...@kernel.org>
Cc: Peter Zijlstra <a.p.zijls...@chello.nl>
Link: 
http://lkml.kernel.org/r/1447047946-1691-11-git-send-email-namhy...@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <a...@redhat.com>
---
 tools/perf/ui/gtk/hists.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 62 insertions(+)

diff --git a/tools/perf/ui/gtk/hists.c b/tools/perf/ui/gtk/hists.c
index 0b24cd6..4677172 100644
--- a/tools/perf/ui/gtk/hists.c
+++ b/tools/perf/ui/gtk/hists.c
@@ -152,6 +152,66 @@ static void perf_gtk__add_callchain_flat(struct rb_root 
*root, GtkTreeStore *sto
        }
 }
 
+static void perf_gtk__add_callchain_folded(struct rb_root *root, GtkTreeStore 
*store,
+                                          GtkTreeIter *parent, int col, u64 
total)
+{
+       struct rb_node *nd;
+
+       for (nd = rb_first(root); nd; nd = rb_next(nd)) {
+               struct callchain_node *node;
+               struct callchain_list *chain;
+               GtkTreeIter iter;
+               char buf[64];
+               char *str, *str_alloc = NULL;
+               bool first = true;
+
+               node = rb_entry(nd, struct callchain_node, rb_node);
+
+               callchain_node__make_parent_list(node);
+
+               list_for_each_entry(chain, &node->parent_val, list) {
+                       char name[1024];
+
+                       callchain_list__sym_name(chain, name, sizeof(name), 
false);
+
+                       if (asprintf(&str, "%s%s%s",
+                                    first ? "" : str_alloc,
+                                    first ? "" : symbol_conf.field_sep ?: "; ",
+                                    name) < 0)
+                               return;
+
+                       first = false;
+                       free(str_alloc);
+                       str_alloc = str;
+               }
+
+               list_for_each_entry(chain, &node->val, list) {
+                       char name[1024];
+
+                       callchain_list__sym_name(chain, name, sizeof(name), 
false);
+
+                       if (asprintf(&str, "%s%s%s",
+                                    first ? "" : str_alloc,
+                                    first ? "" : symbol_conf.field_sep ?: "; ",
+                                    name) < 0)
+                               return;
+
+                       first = false;
+                       free(str_alloc);
+                       str_alloc = str;
+               }
+
+               gtk_tree_store_append(store, &iter, parent);
+
+               callchain_node__scnprintf_value(node, buf, sizeof(buf), total);
+               gtk_tree_store_set(store, &iter, 0, buf, -1);
+
+               gtk_tree_store_set(store, &iter, col, str, -1);
+
+               free(str_alloc);
+       }
+}
+
 static void perf_gtk__add_callchain_graph(struct rb_root *root, GtkTreeStore 
*store,
                                          GtkTreeIter *parent, int col, u64 
total)
 {
@@ -207,6 +267,8 @@ static void perf_gtk__add_callchain(struct rb_root *root, 
GtkTreeStore *store,
 {
        if (callchain_param.mode == CHAIN_FLAT)
                perf_gtk__add_callchain_flat(root, store, parent, col, total);
+       else if (callchain_param.mode == CHAIN_FOLDED)
+               perf_gtk__add_callchain_folded(root, store, parent, col, total);
        else
                perf_gtk__add_callchain_graph(root, store, parent, col, total);
 }
--
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/

Reply via email to