diff options
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 && |
