diff options
Diffstat (limited to 'tools/perf')
-rw-r--r-- | tools/perf/ui/browsers/hists.c | 31 | ||||
-rw-r--r-- | tools/perf/ui/gtk/hists.c | 31 | ||||
-rw-r--r-- | tools/perf/ui/hist.c | 26 | ||||
-rw-r--r-- | tools/perf/ui/stdio/hist.c | 55 | ||||
-rw-r--r-- | tools/perf/util/hist.c | 2 | ||||
-rw-r--r-- | tools/perf/util/hist.h | 1 |
6 files changed, 63 insertions, 83 deletions
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index b0861e3e50a5..847de116b9ec 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c | |||
@@ -760,8 +760,8 @@ static int hist_browser__show_entry(struct hist_browser *browser, | |||
760 | if (!browser->b.navkeypressed) | 760 | if (!browser->b.navkeypressed) |
761 | width += 1; | 761 | width += 1; |
762 | 762 | ||
763 | hist_entry__sort_snprintf(entry, s, sizeof(s), browser->hists); | 763 | slsmg_write_nstring("", width); |
764 | slsmg_write_nstring(s, width); | 764 | |
765 | ++row; | 765 | ++row; |
766 | ++printed; | 766 | ++printed; |
767 | } else | 767 | } else |
@@ -1104,27 +1104,32 @@ static int hist_browser__fprintf_entry(struct hist_browser *browser, | |||
1104 | struct hist_entry *he, FILE *fp) | 1104 | struct hist_entry *he, FILE *fp) |
1105 | { | 1105 | { |
1106 | char s[8192]; | 1106 | char s[8192]; |
1107 | double percent; | ||
1108 | int printed = 0; | 1107 | int printed = 0; |
1109 | char folded_sign = ' '; | 1108 | char folded_sign = ' '; |
1109 | struct perf_hpp hpp = { | ||
1110 | .buf = s, | ||
1111 | .size = sizeof(s), | ||
1112 | }; | ||
1113 | struct perf_hpp_fmt *fmt; | ||
1114 | bool first = true; | ||
1115 | int ret; | ||
1110 | 1116 | ||
1111 | if (symbol_conf.use_callchain) | 1117 | if (symbol_conf.use_callchain) |
1112 | folded_sign = hist_entry__folded(he); | 1118 | folded_sign = hist_entry__folded(he); |
1113 | 1119 | ||
1114 | hist_entry__sort_snprintf(he, s, sizeof(s), browser->hists); | ||
1115 | percent = (he->stat.period * 100.0) / browser->hists->stats.total_period; | ||
1116 | |||
1117 | if (symbol_conf.use_callchain) | 1120 | if (symbol_conf.use_callchain) |
1118 | printed += fprintf(fp, "%c ", folded_sign); | 1121 | printed += fprintf(fp, "%c ", folded_sign); |
1119 | 1122 | ||
1120 | printed += fprintf(fp, " %5.2f%%", percent); | 1123 | perf_hpp__for_each_format(fmt) { |
1121 | 1124 | if (!first) { | |
1122 | if (symbol_conf.show_nr_samples) | 1125 | ret = scnprintf(hpp.buf, hpp.size, " "); |
1123 | printed += fprintf(fp, " %11u", he->stat.nr_events); | 1126 | advance_hpp(&hpp, ret); |
1124 | 1127 | } else | |
1125 | if (symbol_conf.show_total_period) | 1128 | first = false; |
1126 | printed += fprintf(fp, " %12" PRIu64, he->stat.period); | ||
1127 | 1129 | ||
1130 | ret = fmt->entry(fmt, &hpp, he); | ||
1131 | advance_hpp(&hpp, ret); | ||
1132 | } | ||
1128 | printed += fprintf(fp, "%s\n", rtrim(s)); | 1133 | printed += fprintf(fp, "%s\n", rtrim(s)); |
1129 | 1134 | ||
1130 | if (folded_sign == '-') | 1135 | if (folded_sign == '-') |
diff --git a/tools/perf/ui/gtk/hists.c b/tools/perf/ui/gtk/hists.c index 91f10f3f6dd1..d5c336e1bb14 100644 --- a/tools/perf/ui/gtk/hists.c +++ b/tools/perf/ui/gtk/hists.c | |||
@@ -153,7 +153,6 @@ static void perf_gtk__show_hists(GtkWidget *window, struct hists *hists, | |||
153 | struct perf_hpp_fmt *fmt; | 153 | struct perf_hpp_fmt *fmt; |
154 | GType col_types[MAX_COLUMNS]; | 154 | GType col_types[MAX_COLUMNS]; |
155 | GtkCellRenderer *renderer; | 155 | GtkCellRenderer *renderer; |
156 | struct sort_entry *se; | ||
157 | GtkTreeStore *store; | 156 | GtkTreeStore *store; |
158 | struct rb_node *nd; | 157 | struct rb_node *nd; |
159 | GtkWidget *view; | 158 | GtkWidget *view; |
@@ -172,16 +171,6 @@ static void perf_gtk__show_hists(GtkWidget *window, struct hists *hists, | |||
172 | perf_hpp__for_each_format(fmt) | 171 | perf_hpp__for_each_format(fmt) |
173 | col_types[nr_cols++] = G_TYPE_STRING; | 172 | col_types[nr_cols++] = G_TYPE_STRING; |
174 | 173 | ||
175 | list_for_each_entry(se, &hist_entry__sort_list, list) { | ||
176 | if (se->elide) | ||
177 | continue; | ||
178 | |||
179 | if (se == &sort_sym) | ||
180 | sym_col = nr_cols; | ||
181 | |||
182 | col_types[nr_cols++] = G_TYPE_STRING; | ||
183 | } | ||
184 | |||
185 | store = gtk_tree_store_newv(nr_cols, col_types); | 174 | store = gtk_tree_store_newv(nr_cols, col_types); |
186 | 175 | ||
187 | view = gtk_tree_view_new(); | 176 | view = gtk_tree_view_new(); |
@@ -199,16 +188,6 @@ static void perf_gtk__show_hists(GtkWidget *window, struct hists *hists, | |||
199 | col_idx++, NULL); | 188 | col_idx++, NULL); |
200 | } | 189 | } |
201 | 190 | ||
202 | list_for_each_entry(se, &hist_entry__sort_list, list) { | ||
203 | if (se->elide) | ||
204 | continue; | ||
205 | |||
206 | gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), | ||
207 | -1, se->se_header, | ||
208 | renderer, "text", | ||
209 | col_idx++, NULL); | ||
210 | } | ||
211 | |||
212 | for (col_idx = 0; col_idx < nr_cols; col_idx++) { | 191 | for (col_idx = 0; col_idx < nr_cols; col_idx++) { |
213 | GtkTreeViewColumn *column; | 192 | GtkTreeViewColumn *column; |
214 | 193 | ||
@@ -253,16 +232,6 @@ static void perf_gtk__show_hists(GtkWidget *window, struct hists *hists, | |||
253 | gtk_tree_store_set(store, &iter, col_idx++, s, -1); | 232 | gtk_tree_store_set(store, &iter, col_idx++, s, -1); |
254 | } | 233 | } |
255 | 234 | ||
256 | list_for_each_entry(se, &hist_entry__sort_list, list) { | ||
257 | if (se->elide) | ||
258 | continue; | ||
259 | |||
260 | se->se_snprintf(h, s, ARRAY_SIZE(s), | ||
261 | hists__col_len(hists, se->se_width_idx)); | ||
262 | |||
263 | gtk_tree_store_set(store, &iter, col_idx++, s, -1); | ||
264 | } | ||
265 | |||
266 | if (symbol_conf.use_callchain && sort__has_sym) { | 235 | if (symbol_conf.use_callchain && sort__has_sym) { |
267 | if (callchain_param.mode == CHAIN_GRAPH_REL) | 236 | if (callchain_param.mode == CHAIN_GRAPH_REL) |
268 | total = h->stat.period; | 237 | total = h->stat.period; |
diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c index 0299385284fd..400437ee60b1 100644 --- a/tools/perf/ui/hist.c +++ b/tools/perf/ui/hist.c | |||
@@ -354,6 +354,14 @@ LIST_HEAD(perf_hpp__sort_list); | |||
354 | 354 | ||
355 | void perf_hpp__init(void) | 355 | void perf_hpp__init(void) |
356 | { | 356 | { |
357 | struct list_head *list; | ||
358 | int i; | ||
359 | |||
360 | for (i = 0; i < PERF_HPP__MAX_INDEX; i++) { | ||
361 | INIT_LIST_HEAD(&perf_hpp__format[i].list); | ||
362 | INIT_LIST_HEAD(&perf_hpp__format[i].sort_list); | ||
363 | } | ||
364 | |||
357 | perf_hpp__column_enable(PERF_HPP__OVERHEAD); | 365 | perf_hpp__column_enable(PERF_HPP__OVERHEAD); |
358 | 366 | ||
359 | if (symbol_conf.show_cpu_utilization) { | 367 | if (symbol_conf.show_cpu_utilization) { |
@@ -371,6 +379,13 @@ void perf_hpp__init(void) | |||
371 | 379 | ||
372 | if (symbol_conf.show_total_period) | 380 | if (symbol_conf.show_total_period) |
373 | perf_hpp__column_enable(PERF_HPP__PERIOD); | 381 | perf_hpp__column_enable(PERF_HPP__PERIOD); |
382 | |||
383 | /* prepend overhead field for backward compatiblity. */ | ||
384 | list = &perf_hpp__format[PERF_HPP__OVERHEAD].sort_list; | ||
385 | if (list_empty(list)) | ||
386 | list_add(list, &perf_hpp__sort_list); | ||
387 | |||
388 | perf_hpp__setup_output_field(); | ||
374 | } | 389 | } |
375 | 390 | ||
376 | void perf_hpp__column_register(struct perf_hpp_fmt *format) | 391 | void perf_hpp__column_register(struct perf_hpp_fmt *format) |
@@ -389,6 +404,17 @@ void perf_hpp__column_enable(unsigned col) | |||
389 | perf_hpp__column_register(&perf_hpp__format[col]); | 404 | perf_hpp__column_register(&perf_hpp__format[col]); |
390 | } | 405 | } |
391 | 406 | ||
407 | void perf_hpp__setup_output_field(void) | ||
408 | { | ||
409 | struct perf_hpp_fmt *fmt; | ||
410 | |||
411 | /* append sort keys to output field */ | ||
412 | perf_hpp__for_each_sort_list(fmt) { | ||
413 | if (list_empty(&fmt->list)) | ||
414 | perf_hpp__column_register(fmt); | ||
415 | } | ||
416 | } | ||
417 | |||
392 | int hist_entry__sort_snprintf(struct hist_entry *he, char *s, size_t size, | 418 | int hist_entry__sort_snprintf(struct hist_entry *he, char *s, size_t size, |
393 | struct hists *hists) | 419 | struct hists *hists) |
394 | { | 420 | { |
diff --git a/tools/perf/ui/stdio/hist.c b/tools/perf/ui/stdio/hist.c index 9eccf7f4f367..49e2e4a7346a 100644 --- a/tools/perf/ui/stdio/hist.c +++ b/tools/perf/ui/stdio/hist.c | |||
@@ -306,8 +306,7 @@ static size_t hist_entry__callchain_fprintf(struct hist_entry *he, | |||
306 | return hist_entry_callchain__fprintf(he, total_period, left_margin, fp); | 306 | return hist_entry_callchain__fprintf(he, total_period, left_margin, fp); |
307 | } | 307 | } |
308 | 308 | ||
309 | static int hist_entry__period_snprintf(struct perf_hpp *hpp, | 309 | static int hist_entry__snprintf(struct hist_entry *he, struct perf_hpp *hpp) |
310 | struct hist_entry *he) | ||
311 | { | 310 | { |
312 | const char *sep = symbol_conf.field_sep; | 311 | const char *sep = symbol_conf.field_sep; |
313 | struct perf_hpp_fmt *fmt; | 312 | struct perf_hpp_fmt *fmt; |
@@ -353,8 +352,7 @@ static int hist_entry__fprintf(struct hist_entry *he, size_t size, | |||
353 | if (size == 0 || size > bfsz) | 352 | if (size == 0 || size > bfsz) |
354 | size = hpp.size = bfsz; | 353 | size = hpp.size = bfsz; |
355 | 354 | ||
356 | ret = hist_entry__period_snprintf(&hpp, he); | 355 | hist_entry__snprintf(he, &hpp); |
357 | hist_entry__sort_snprintf(he, bf + ret, size - ret, hists); | ||
358 | 356 | ||
359 | ret = fprintf(fp, "%s\n", bf); | 357 | ret = fprintf(fp, "%s\n", bf); |
360 | 358 | ||
@@ -386,28 +384,9 @@ size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows, | |||
386 | 384 | ||
387 | init_rem_hits(); | 385 | init_rem_hits(); |
388 | 386 | ||
389 | if (!show_header) | ||
390 | goto print_entries; | ||
391 | |||
392 | fprintf(fp, "# "); | ||
393 | |||
394 | perf_hpp__for_each_format(fmt) { | ||
395 | if (!first) | ||
396 | fprintf(fp, "%s", sep ?: " "); | ||
397 | else | ||
398 | first = false; | ||
399 | |||
400 | fmt->header(fmt, &dummy_hpp, hists_to_evsel(hists)); | ||
401 | fprintf(fp, "%s", bf); | ||
402 | } | ||
403 | |||
404 | list_for_each_entry(se, &hist_entry__sort_list, list) { | 387 | list_for_each_entry(se, &hist_entry__sort_list, list) { |
405 | if (se->elide) | 388 | if (se->elide) |
406 | continue; | 389 | continue; |
407 | if (sep) { | ||
408 | fprintf(fp, "%c%s", *sep, se->se_header); | ||
409 | continue; | ||
410 | } | ||
411 | width = strlen(se->se_header); | 390 | width = strlen(se->se_header); |
412 | if (symbol_conf.col_width_list_str) { | 391 | if (symbol_conf.col_width_list_str) { |
413 | if (col_width) { | 392 | if (col_width) { |
@@ -420,7 +399,21 @@ size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows, | |||
420 | } | 399 | } |
421 | if (!hists__new_col_len(hists, se->se_width_idx, width)) | 400 | if (!hists__new_col_len(hists, se->se_width_idx, width)) |
422 | width = hists__col_len(hists, se->se_width_idx); | 401 | width = hists__col_len(hists, se->se_width_idx); |
423 | fprintf(fp, " %*s", width, se->se_header); | 402 | } |
403 | |||
404 | if (!show_header) | ||
405 | goto print_entries; | ||
406 | |||
407 | fprintf(fp, "# "); | ||
408 | |||
409 | perf_hpp__for_each_format(fmt) { | ||
410 | if (!first) | ||
411 | fprintf(fp, "%s", sep ?: " "); | ||
412 | else | ||
413 | first = false; | ||
414 | |||
415 | fmt->header(fmt, &dummy_hpp, hists_to_evsel(hists)); | ||
416 | fprintf(fp, "%s", bf); | ||
424 | } | 417 | } |
425 | 418 | ||
426 | fprintf(fp, "\n"); | 419 | fprintf(fp, "\n"); |
@@ -447,20 +440,6 @@ size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows, | |||
447 | fprintf(fp, "."); | 440 | fprintf(fp, "."); |
448 | } | 441 | } |
449 | 442 | ||
450 | list_for_each_entry(se, &hist_entry__sort_list, list) { | ||
451 | unsigned int i; | ||
452 | |||
453 | if (se->elide) | ||
454 | continue; | ||
455 | |||
456 | fprintf(fp, " "); | ||
457 | width = hists__col_len(hists, se->se_width_idx); | ||
458 | if (width == 0) | ||
459 | width = strlen(se->se_header); | ||
460 | for (i = 0; i < width; i++) | ||
461 | fprintf(fp, "."); | ||
462 | } | ||
463 | |||
464 | fprintf(fp, "\n"); | 443 | fprintf(fp, "\n"); |
465 | if (max_rows && ++nr_rows >= max_rows) | 444 | if (max_rows && ++nr_rows >= max_rows) |
466 | goto out; | 445 | goto out; |
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index c99ae4dd973e..ae13c2dbd27a 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c | |||
@@ -569,7 +569,7 @@ static int hist_entry__sort(struct hist_entry *a, struct hist_entry *b) | |||
569 | struct perf_hpp_fmt *fmt; | 569 | struct perf_hpp_fmt *fmt; |
570 | int64_t cmp = 0; | 570 | int64_t cmp = 0; |
571 | 571 | ||
572 | perf_hpp__for_each_format(fmt) { | 572 | perf_hpp__for_each_sort_list(fmt) { |
573 | cmp = fmt->sort(a, b); | 573 | cmp = fmt->sort(a, b); |
574 | if (cmp) | 574 | if (cmp) |
575 | break; | 575 | break; |
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h index eee154a41723..e76d3232672c 100644 --- a/tools/perf/util/hist.h +++ b/tools/perf/util/hist.h | |||
@@ -196,6 +196,7 @@ void perf_hpp__init(void); | |||
196 | void perf_hpp__column_register(struct perf_hpp_fmt *format); | 196 | void perf_hpp__column_register(struct perf_hpp_fmt *format); |
197 | void perf_hpp__column_enable(unsigned col); | 197 | void perf_hpp__column_enable(unsigned col); |
198 | void perf_hpp__register_sort_field(struct perf_hpp_fmt *format); | 198 | void perf_hpp__register_sort_field(struct perf_hpp_fmt *format); |
199 | void perf_hpp__setup_output_field(void); | ||
199 | 200 | ||
200 | typedef u64 (*hpp_field_fn)(struct hist_entry *he); | 201 | typedef u64 (*hpp_field_fn)(struct hist_entry *he); |
201 | typedef int (*hpp_callback_fn)(struct perf_hpp *hpp, bool front); | 202 | typedef int (*hpp_callback_fn)(struct perf_hpp *hpp, bool front); |