perf report: Use hierarchy hpp list on gtk
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>
This commit is contained in:
parent
a61a22f684
commit
58ecd33be9
@ -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),
|
||||
|
Loading…
Reference in New Issue
Block a user