aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-report.c
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2010-05-10 12:04:11 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2010-05-10 12:13:49 -0400
commit1c02c4d2e92f2097f1bba63ec71560b0e05a7f36 (patch)
treead2a722931398ce3cd3ae850c4cfa148558a52ea /tools/perf/builtin-report.c
parentd118f8ba6ac2af2bf11d40cba657c813f0f39ca2 (diff)
perf hist: Introduce hists class and move lots of methods to it
In cbbc79a we introduced support for multiple events by introducing a new "event_stat_id" struct and then made several perf_session methods receive a point to it instead of a pointer to perf_session, and kept the event_stats and hists rb_tree in perf_session. While working on the new newt based browser, I realised that it would be better to introduce a new class, "hists" (short for "histograms"), renaming the "event_stat_id" struct and the perf_session methods that were really "hists" methods, as they manipulate only struct hists members, not touching anything in the other perf_session members. Other optimizations, such as calculating the maximum lenght of a symbol name present in an hists instance will be possible as we add them, avoiding a re-traversal just for finding that information. The rationale for the name "hists" to replace "event_stat_id" is that we may have multiple sets of hists for the same event_stat id, as, for instance, the 'perf diff' tool has, so event stat id is not what characterizes what this struct and the functions that manipulate it do. Cc: Eric B Munson <ebmunson@us.ibm.com> Cc: Frédéric Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Tom Zanussi <tzanussi@gmail.com> LKML-Reference: <new-submission> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/builtin-report.c')
-rw-r--r--tools/perf/builtin-report.c71
1 files changed, 35 insertions, 36 deletions
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 642a6d8eb5dc..53077fd973f0 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -44,16 +44,17 @@ static char *pretty_printing_style = default_pretty_printing_style;
44 44
45static char callchain_default_opt[] = "fractal,0.5"; 45static char callchain_default_opt[] = "fractal,0.5";
46 46
47static struct event_stat_id *get_stats(struct perf_session *self, 47static struct hists *perf_session__hists_findnew(struct perf_session *self,
48 u64 event_stream, u32 type, u64 config) 48 u64 event_stream, u32 type,
49 u64 config)
49{ 50{
50 struct rb_node **p = &self->stats_by_id.rb_node; 51 struct rb_node **p = &self->hists_tree.rb_node;
51 struct rb_node *parent = NULL; 52 struct rb_node *parent = NULL;
52 struct event_stat_id *iter, *new; 53 struct hists *iter, *new;
53 54
54 while (*p != NULL) { 55 while (*p != NULL) {
55 parent = *p; 56 parent = *p;
56 iter = rb_entry(parent, struct event_stat_id, rb_node); 57 iter = rb_entry(parent, struct hists, rb_node);
57 if (iter->config == config) 58 if (iter->config == config)
58 return iter; 59 return iter;
59 60
@@ -64,15 +65,15 @@ static struct event_stat_id *get_stats(struct perf_session *self,
64 p = &(*p)->rb_left; 65 p = &(*p)->rb_left;
65 } 66 }
66 67
67 new = malloc(sizeof(struct event_stat_id)); 68 new = malloc(sizeof(struct hists));
68 if (new == NULL) 69 if (new == NULL)
69 return NULL; 70 return NULL;
70 memset(new, 0, sizeof(struct event_stat_id)); 71 memset(new, 0, sizeof(struct hists));
71 new->event_stream = event_stream; 72 new->event_stream = event_stream;
72 new->config = config; 73 new->config = config;
73 new->type = type; 74 new->type = type;
74 rb_link_node(&new->rb_node, parent, p); 75 rb_link_node(&new->rb_node, parent, p);
75 rb_insert_color(&new->rb_node, &self->stats_by_id); 76 rb_insert_color(&new->rb_node, &self->hists_tree);
76 return new; 77 return new;
77} 78}
78 79
@@ -84,7 +85,7 @@ static int perf_session__add_hist_entry(struct perf_session *self,
84 struct symbol *parent = NULL; 85 struct symbol *parent = NULL;
85 int err = -ENOMEM; 86 int err = -ENOMEM;
86 struct hist_entry *he; 87 struct hist_entry *he;
87 struct event_stat_id *stats; 88 struct hists *hists;
88 struct perf_event_attr *attr; 89 struct perf_event_attr *attr;
89 90
90 if ((sort__has_parent || symbol_conf.use_callchain) && data->callchain) { 91 if ((sort__has_parent || symbol_conf.use_callchain) && data->callchain) {
@@ -96,13 +97,12 @@ static int perf_session__add_hist_entry(struct perf_session *self,
96 97
97 attr = perf_header__find_attr(data->id, &self->header); 98 attr = perf_header__find_attr(data->id, &self->header);
98 if (attr) 99 if (attr)
99 stats = get_stats(self, data->id, attr->type, attr->config); 100 hists = perf_session__hists_findnew(self, data->id, attr->type, attr->config);
100 else 101 else
101 stats = get_stats(self, data->id, 0, 0); 102 hists = perf_session__hists_findnew(self, data->id, 0, 0);
102 if (stats == NULL) 103 if (hists == NULL)
103 goto out_free_syms; 104 goto out_free_syms;
104 he = __perf_session__add_hist_entry(&stats->hists, al, parent, 105 he = __hists__add_entry(hists, al, parent, data->period);
105 data->period);
106 if (he == NULL) 106 if (he == NULL)
107 goto out_free_syms; 107 goto out_free_syms;
108 err = 0; 108 err = 0;
@@ -117,18 +117,19 @@ static int add_event_total(struct perf_session *session,
117 struct sample_data *data, 117 struct sample_data *data,
118 struct perf_event_attr *attr) 118 struct perf_event_attr *attr)
119{ 119{
120 struct event_stat_id *stats; 120 struct hists *hists;
121 121
122 if (attr) 122 if (attr)
123 stats = get_stats(session, data->id, attr->type, attr->config); 123 hists = perf_session__hists_findnew(session, data->id,
124 attr->type, attr->config);
124 else 125 else
125 stats = get_stats(session, data->id, 0, 0); 126 hists = perf_session__hists_findnew(session, data->id, 0, 0);
126 127
127 if (!stats) 128 if (!hists)
128 return -ENOMEM; 129 return -ENOMEM;
129 130
130 stats->stats.total += data->period; 131 hists->stats.total += data->period;
131 session->events_stats.total += data->period; 132 session->hists.stats.total += data->period;
132 return 0; 133 return 0;
133} 134}
134 135
@@ -292,35 +293,33 @@ static int __cmd_report(void)
292 if (verbose > 2) 293 if (verbose > 2)
293 perf_session__fprintf_dsos(session, stdout); 294 perf_session__fprintf_dsos(session, stdout);
294 295
295 next = rb_first(&session->stats_by_id); 296 next = rb_first(&session->hists_tree);
296 while (next) { 297 while (next) {
297 struct event_stat_id *stats; 298 struct hists *hists;
298 u64 nr_hists; 299 u64 nr_hists;
299 300
300 stats = rb_entry(next, struct event_stat_id, rb_node); 301 hists = rb_entry(next, struct hists, rb_node);
301 perf_session__collapse_resort(&stats->hists); 302 hists__collapse_resort(hists);
302 nr_hists = perf_session__output_resort(&stats->hists, 303 nr_hists = hists__output_resort(hists);
303 stats->stats.total);
304 if (use_browser) 304 if (use_browser)
305 perf_session__browse_hists(&stats->hists, nr_hists, 305 perf_session__browse_hists(&hists->entries, nr_hists,
306 stats->stats.total, help, 306 hists->stats.total, help,
307 input_name); 307 input_name);
308 else { 308 else {
309 if (rb_first(&session->stats_by_id) == 309 if (rb_first(&session->hists.entries) ==
310 rb_last(&session->stats_by_id)) 310 rb_last(&session->hists.entries))
311 fprintf(stdout, "# Samples: %Ld\n#\n", 311 fprintf(stdout, "# Samples: %Ld\n#\n",
312 stats->stats.total); 312 hists->stats.total);
313 else 313 else
314 fprintf(stdout, "# Samples: %Ld %s\n#\n", 314 fprintf(stdout, "# Samples: %Ld %s\n#\n",
315 stats->stats.total, 315 hists->stats.total,
316 __event_name(stats->type, stats->config)); 316 __event_name(hists->type, hists->config));
317 317
318 perf_session__fprintf_hists(&stats->hists, NULL, false, stdout, 318 hists__fprintf(hists, NULL, false, stdout);
319 stats->stats.total);
320 fprintf(stdout, "\n\n"); 319 fprintf(stdout, "\n\n");
321 } 320 }
322 321
323 next = rb_next(&stats->rb_node); 322 next = rb_next(&hists->rb_node);
324 } 323 }
325 324
326 if (!use_browser && sort_order == default_sort_order && 325 if (!use_browser && sort_order == default_sort_order &&