diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2010-05-10 12:04:11 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2010-05-10 12:13:49 -0400 |
commit | 1c02c4d2e92f2097f1bba63ec71560b0e05a7f36 (patch) | |
tree | ad2a722931398ce3cd3ae850c4cfa148558a52ea /tools/perf/builtin-report.c | |
parent | d118f8ba6ac2af2bf11d40cba657c813f0f39ca2 (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.c | 71 |
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 | ||
45 | static char callchain_default_opt[] = "fractal,0.5"; | 45 | static char callchain_default_opt[] = "fractal,0.5"; |
46 | 46 | ||
47 | static struct event_stat_id *get_stats(struct perf_session *self, | 47 | static 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 && |