Lines Matching +full:long +full:- +full:press +full:- +full:mode

1 // SPDX-License-Identifier: GPL-2.0
31 #include "../../util/block-info.h"
41 #include "annotate-data.h"
45 #include "time-utils.h"
59 return hists__has_filter(hb->hists) || hb->min_pcnt || symbol_conf.has_filter || hb->c2c_filter; in hist_browser__has_filter()
65 struct hists *hists = browser->hists; in hist_browser__get_folding()
68 for (nd = rb_first_cached(&hists->entries); in hist_browser__get_folding()
69 (nd = hists__filter_entries(nd, browser->min_pcnt)) != NULL; in hist_browser__get_folding()
74 if (he->leaf && he->unfolded) in hist_browser__get_folding()
75 unfolded_rows += he->nr_rows; in hist_browser__get_folding()
82 struct ui_browser *browser = &hb->b; in hist_browser__set_title_space()
83 struct hists *hists = hb->hists; in hist_browser__set_title_space()
84 struct perf_hpp_list *hpp_list = hists->hpp_list; in hist_browser__set_title_space()
86 browser->extra_title_lines = hb->show_headers ? hpp_list->nr_header_lines : 0; in hist_browser__set_title_space()
94 nr_entries = hb->nr_hierarchy_entries; in hist_browser__nr_entries()
96 nr_entries = hb->nr_non_filtered_entries; in hist_browser__nr_entries()
98 nr_entries = hb->hists->nr_entries; in hist_browser__nr_entries()
100 hb->nr_callchain_rows = hist_browser__get_folding(hb); in hist_browser__nr_entries()
101 return nr_entries + hb->nr_callchain_rows; in hist_browser__nr_entries()
106 struct ui_browser *browser = &hb->b; in hist_browser__update_rows()
107 struct hists *hists = hb->hists; in hist_browser__update_rows()
108 struct perf_hpp_list *hpp_list = hists->hpp_list; in hist_browser__update_rows()
111 if (!hb->show_headers) { in hist_browser__update_rows()
112 browser->rows += browser->extra_title_lines; in hist_browser__update_rows()
113 browser->extra_title_lines = 0; in hist_browser__update_rows()
117 browser->extra_title_lines = hpp_list->nr_header_lines; in hist_browser__update_rows()
118 browser->rows -= browser->extra_title_lines; in hist_browser__update_rows()
123 index_row = browser->index - browser->top_idx; in hist_browser__update_rows()
124 if (index_row >= browser->rows) in hist_browser__update_rows()
125 browser->index -= index_row - browser->rows + 1; in hist_browser__update_rows()
132 /* 3 == +/- toggle symbol before actual hist_entry rendering */ in hist_browser__refresh_dimensions()
133 browser->width = 3 + (hists__sort_list_width(hb->hists) + sizeof("[k]")); in hist_browser__refresh_dimensions()
136 * before updating browser->width, as it will invalidate the in hist_browser__refresh_dimensions()
146 * The hists__remove_entry_filter() already folds non-filtered in hist_browser__reset()
149 browser->nr_callchain_rows = 0; in hist_browser__reset()
152 browser->b.nr_entries = hist_browser__nr_entries(browser); in hist_browser__reset()
153 hist_browser__refresh_dimensions(&browser->b); in hist_browser__reset()
154 ui_browser__reset_index(&browser->b); in hist_browser__reset()
159 return unfolded ? '-' : '+'; in tree__folded_sign()
164 return he->has_children ? tree__folded_sign(he->unfolded) : ' '; in hist_entry__folded()
169 return cl->has_children ? tree__folded_sign(cl->unfolded) : ' '; in callchain_list__folded()
174 cl->unfolded = unfold ? cl->has_children : false; in callchain_list__set_folding()
182 for (nd = rb_first(&node->rb_root); nd; nd = rb_next(nd)) { in callchain_node__count_rows_rb_tree()
187 list_for_each_entry(chain, &child->val, list) { in callchain_node__count_rows_rb_tree()
196 if (folded_sign == '-') /* Have children and they're unfolded */ in callchain_node__count_rows_rb_tree()
209 list_for_each_entry(chain, &node->parent_val, list) { in callchain_node__count_flat_rows()
219 list_for_each_entry(chain, &node->val, list) { in callchain_node__count_flat_rows()
221 /* node->parent_val list might be empty */ in callchain_node__count_flat_rows()
243 if (callchain_param.mode == CHAIN_FLAT) in callchain_node__count_rows()
245 else if (callchain_param.mode == CHAIN_FOLDED) in callchain_node__count_rows()
248 list_for_each_entry(chain, &node->val, list) { in callchain_node__count_rows()
251 unfolded = chain->unfolded; in callchain_node__count_rows()
280 if (he->leaf) in hierarchy_count_rows()
281 return callchain__count_rows(&he->sorted_chain); in hierarchy_count_rows()
283 if (he->has_no_entry) in hierarchy_count_rows()
286 node = rb_first_cached(&he->hroot_out); in hierarchy_count_rows()
293 if (!child->filtered && percent >= hb->min_pcnt) { in hierarchy_count_rows()
296 if (include_children && child->unfolded) in hierarchy_count_rows()
310 if (!he->has_children) in hist_entry__toggle_fold()
313 he->unfolded = !he->unfolded; in hist_entry__toggle_fold()
322 if (!cl->has_children) in callchain_list__toggle_fold()
325 cl->unfolded = !cl->unfolded; in callchain_list__toggle_fold()
331 struct rb_node *nd = rb_first(&node->rb_root); in callchain_node__init_have_children_rb_tree()
333 for (nd = rb_first(&node->rb_root); nd; nd = rb_next(nd)) { in callchain_node__init_have_children_rb_tree()
338 list_for_each_entry(chain, &child->val, list) { in callchain_node__init_have_children_rb_tree()
341 chain->has_children = chain->list.next != &child->val || in callchain_node__init_have_children_rb_tree()
342 !RB_EMPTY_ROOT(&child->rb_root); in callchain_node__init_have_children_rb_tree()
344 chain->has_children = chain->list.next == &child->val && in callchain_node__init_have_children_rb_tree()
345 !RB_EMPTY_ROOT(&child->rb_root); in callchain_node__init_have_children_rb_tree()
357 chain = list_entry(node->val.next, struct callchain_list, list); in callchain_node__init_have_children()
358 chain->has_children = has_sibling; in callchain_node__init_have_children()
360 if (!list_empty(&node->val)) { in callchain_node__init_have_children()
361 chain = list_entry(node->val.prev, struct callchain_list, list); in callchain_node__init_have_children()
362 chain->has_children = !RB_EMPTY_ROOT(&node->rb_root); in callchain_node__init_have_children()
376 if (callchain_param.mode == CHAIN_FLAT || in callchain__init_have_children()
377 callchain_param.mode == CHAIN_FOLDED) in callchain__init_have_children()
384 if (he->init_have_children) in hist_entry__init_have_children()
387 if (he->leaf) { in hist_entry__init_have_children()
388 he->has_children = !RB_EMPTY_ROOT(&he->sorted_chain); in hist_entry__init_have_children()
389 callchain__init_have_children(&he->sorted_chain); in hist_entry__init_have_children()
391 he->has_children = !RB_EMPTY_ROOT(&he->hroot_out.rb_root); in hist_entry__init_have_children()
394 he->init_have_children = true; in hist_entry__init_have_children()
399 struct hist_entry *he = browser->he_selection; in hist_browser__selection_has_children()
400 struct map_symbol *ms = browser->selection; in hist_browser__selection_has_children()
405 if (ms == &he->ms) in hist_browser__selection_has_children()
406 return he->has_children; in hist_browser__selection_has_children()
408 return container_of(ms, struct callchain_list, ms)->has_children; in hist_browser__selection_has_children()
413 struct hist_entry *he = browser->he_selection; in hist_browser__selection_unfolded()
414 struct map_symbol *ms = browser->selection; in hist_browser__selection_unfolded()
419 if (ms == &he->ms) in hist_browser__selection_unfolded()
420 return he->unfolded; in hist_browser__selection_unfolded()
422 return container_of(ms, struct callchain_list, ms)->unfolded; in hist_browser__selection_unfolded()
427 struct hist_entry *he = browser->he_selection; in hist_browser__selection_sym_name()
428 struct map_symbol *ms = browser->selection; in hist_browser__selection_sym_name()
434 if (ms == &he->ms) { in hist_browser__selection_sym_name()
440 return callchain_list__sym_name(callchain_entry, bf, size, browser->show_dso); in hist_browser__selection_sym_name()
445 struct hist_entry *he = browser->he_selection; in hist_browser__toggle_fold()
446 struct map_symbol *ms = browser->selection; in hist_browser__toggle_fold()
453 if (ms == &he->ms) in hist_browser__toggle_fold()
462 browser->b.nr_entries -= he->nr_rows; in hist_browser__toggle_fold()
464 if (he->leaf) in hist_browser__toggle_fold()
465 browser->nr_callchain_rows -= he->nr_rows; in hist_browser__toggle_fold()
467 browser->nr_hierarchy_entries -= he->nr_rows; in hist_browser__toggle_fold()
472 if (he->unfolded) { in hist_browser__toggle_fold()
473 if (he->leaf) in hist_browser__toggle_fold()
474 he->nr_rows = callchain__count_rows( in hist_browser__toggle_fold()
475 &he->sorted_chain); in hist_browser__toggle_fold()
477 he->nr_rows = hierarchy_count_rows(browser, he, false); in hist_browser__toggle_fold()
481 browser->b.nr_entries += child_rows - he->nr_rows; in hist_browser__toggle_fold()
483 if (!he->leaf && he->nr_rows == 0) { in hist_browser__toggle_fold()
484 he->has_no_entry = true; in hist_browser__toggle_fold()
485 he->nr_rows = 1; in hist_browser__toggle_fold()
489 browser->b.nr_entries -= child_rows - he->nr_rows; in hist_browser__toggle_fold()
491 if (he->has_no_entry) in hist_browser__toggle_fold()
492 he->has_no_entry = false; in hist_browser__toggle_fold()
494 he->nr_rows = 0; in hist_browser__toggle_fold()
497 browser->b.nr_entries += he->nr_rows; in hist_browser__toggle_fold()
499 if (he->leaf) in hist_browser__toggle_fold()
500 browser->nr_callchain_rows += he->nr_rows; in hist_browser__toggle_fold()
502 browser->nr_hierarchy_entries += he->nr_rows; in hist_browser__toggle_fold()
516 for (nd = rb_first(&node->rb_root); nd; nd = rb_next(nd)) { in callchain_node__set_folding_rb_tree()
521 list_for_each_entry(chain, &child->val, list) { in callchain_node__set_folding_rb_tree()
524 has_children = chain->has_children; in callchain_node__set_folding_rb_tree()
540 list_for_each_entry(chain, &node->val, list) { in callchain_node__set_folding()
543 has_children = chain->has_children; in callchain_node__set_folding()
573 for (nd = rb_first_cached(&he->hroot_out); nd; nd = rb_next(nd)) { in hierarchy_set_folding()
576 if (!child->filtered && percent >= hb->min_pcnt) in hierarchy_set_folding()
587 he->unfolded = unfold ? he->has_children : false; in hist_entry__set_folding()
589 if (he->has_children) { in hist_entry__set_folding()
592 if (he->leaf) in hist_entry__set_folding()
593 n = callchain__set_folding(&he->sorted_chain, unfold); in hist_entry__set_folding()
597 he->nr_rows = unfold ? n : 0; in hist_entry__set_folding()
599 he->nr_rows = 0; in hist_entry__set_folding()
609 nd = rb_first_cached(&browser->hists->entries); in __hist_browser__set_folding()
619 if (he->filtered || percent < browser->min_pcnt) in __hist_browser__set_folding()
622 if (!he->depth || unfold) in __hist_browser__set_folding()
623 browser->nr_hierarchy_entries++; in __hist_browser__set_folding()
624 if (he->leaf) in __hist_browser__set_folding()
625 browser->nr_callchain_rows += he->nr_rows; in __hist_browser__set_folding()
626 else if (unfold && !hist_entry__has_hierarchy_children(he, browser->min_pcnt)) { in __hist_browser__set_folding()
627 browser->nr_hierarchy_entries++; in __hist_browser__set_folding()
628 he->has_no_entry = true; in __hist_browser__set_folding()
629 he->nr_rows = 1; in __hist_browser__set_folding()
631 he->has_no_entry = false; in __hist_browser__set_folding()
637 browser->nr_hierarchy_entries = 0; in hist_browser__set_folding()
638 browser->nr_callchain_rows = 0; in hist_browser__set_folding()
641 browser->b.nr_entries = hist_browser__nr_entries(browser); in hist_browser__set_folding()
643 ui_browser__reset_index(&browser->b); in hist_browser__set_folding()
648 if (!browser->he_selection) in hist_browser__set_folding_selected()
651 if (unfold == browser->he_selection->unfolded) in hist_browser__set_folding_selected()
662 " perf top -r 80\n\n" in ui_browser__warn_lost_events()
668 return browser->title ? browser->title(browser, bf, size) : 0; in hist_browser__title()
675 struct hist_browser_timer *hbt = browser->hbt; in hist_browser__handle_hotkey()
676 struct evsel *evsel = hists_to_evsel(browser->hists); in hist_browser__handle_hotkey()
682 hbt->timer(hbt->arg); in hist_browser__handle_hotkey()
688 ui_browser__update_nr_entries(&browser->b, nr_entries); in hist_browser__handle_hotkey()
691 (evsel->evlist->stats.nr_lost_warned != in hist_browser__handle_hotkey()
692 evsel->evlist->stats.nr_events[PERF_RECORD_LOST])) { in hist_browser__handle_hotkey()
693 evsel->evlist->stats.nr_lost_warned = in hist_browser__handle_hotkey()
694 evsel->evlist->stats.nr_events[PERF_RECORD_LOST]; in hist_browser__handle_hotkey()
695 ui_browser__warn_lost_events(&browser->b); in hist_browser__handle_hotkey()
699 ui_browser__show_title(&browser->b, title); in hist_browser__handle_hotkey()
703 struct hist_entry *h = rb_entry(browser->b.top, struct hist_entry, rb_node); in hist_browser__handle_hotkey()
708 seq++, browser->b.nr_entries, browser->hists->nr_entries, in hist_browser__handle_hotkey()
709 browser->b.extra_title_lines, browser->b.rows, in hist_browser__handle_hotkey()
710 browser->b.index, browser->b.top_idx, h->row_offset, h->nr_rows); in hist_browser__handle_hotkey()
730 browser->show_headers = !browser->show_headers; in hist_browser__handle_hotkey()
738 return -1; in hist_browser__handle_hotkey()
748 struct hist_browser_timer *hbt = browser->hbt; in hist_browser__run()
749 int delay_secs = hbt ? hbt->refresh : 0; in hist_browser__run()
751 browser->b.entries = &browser->hists->entries; in hist_browser__run()
752 browser->b.nr_entries = hist_browser__nr_entries(browser); in hist_browser__run()
756 if (ui_browser__show(&browser->b, title, "%s", help) < 0) in hist_browser__run()
757 return -1; in hist_browser__run()
763 key = ui_browser__run(&browser->b, delay_secs); in hist_browser__run()
769 ui_browser__hide(&browser->b); in hist_browser__run()
797 bool show_annotated = browser->show_dso && chain->ms.sym && symbol__annotation(chain->ms.sym)->src; in hist_browser__show_callchain_entry()
800 width = browser->b.width - (offset + 2); in hist_browser__show_callchain_entry()
801 if (ui_browser__is_current_entry(&browser->b, row)) { in hist_browser__show_callchain_entry()
802 browser->selection = &chain->ms; in hist_browser__show_callchain_entry()
804 arg->is_current_entry = true; in hist_browser__show_callchain_entry()
807 ui_browser__set_color(&browser->b, color); in hist_browser__show_callchain_entry()
808 ui_browser__gotorc(&browser->b, row, 0); in hist_browser__show_callchain_entry()
809 ui_browser__write_nstring(&browser->b, " ", offset); in hist_browser__show_callchain_entry()
810 ui_browser__printf(&browser->b, "%c", folded_sign); in hist_browser__show_callchain_entry()
811 ui_browser__write_graph(&browser->b, show_annotated ? SLSMG_RARROW_CHAR : ' '); in hist_browser__show_callchain_entry()
812 ui_browser__write_nstring(&browser->b, str, width); in hist_browser__show_callchain_entry()
823 arg->printed += fprintf(arg->fp, "%*s%c %s\n", offset, " ", in hist_browser__fprintf_callchain_entry()
833 return browser->b.rows == row; in hist_browser__check_output_full()
857 if (arg->row_offset != 0) { in hist_browser__show_callchain_list()
858 arg->row_offset--; in hist_browser__show_callchain_list()
866 browser->show_dso); in hist_browser__show_callchain_list()
932 list_for_each_entry(chain, &child->parent_val, list) { in hist_browser__show_callchain_flat()
955 list_for_each_entry(chain, &child->val, list) { in hist_browser__show_callchain_flat()
984 return row - first_row; in hist_browser__show_callchain_flat()
996 browser->show_dso); in hist_browser__folded_callchain_str()
1036 if (arg->row_offset != 0) { in hist_browser__show_callchain_folded()
1037 arg->row_offset--; in hist_browser__show_callchain_folded()
1052 list_for_each_entry(chain, &child->parent_val, list) { in hist_browser__show_callchain_folded()
1068 list_for_each_entry(chain, &child->val, list) { in hist_browser__show_callchain_folded()
1095 return row - first_row; in hist_browser__show_callchain_folded()
1111 if (callchain_param.mode == CHAIN_GRAPH_REL) in hist_browser__show_callchain_graph()
1125 list_for_each_entry(chain, &child->val, list) { in hist_browser__show_callchain_graph()
1148 if (folded_sign == '-') { in hist_browser__show_callchain_graph()
1151 row += hist_browser__show_callchain_graph(browser, &child->rb_root, in hist_browser__show_callchain_graph()
1153 child->children_hit, in hist_browser__show_callchain_graph()
1161 return row - first_row; in hist_browser__show_callchain_graph()
1171 u64 total = hists__total_period(entry->hists); in hist_browser__show_callchain()
1176 parent_total = entry->stat_acc->period; in hist_browser__show_callchain()
1178 parent_total = entry->stat.period; in hist_browser__show_callchain()
1180 if (callchain_param.mode == CHAIN_FLAT) { in hist_browser__show_callchain()
1182 &entry->sorted_chain, row, in hist_browser__show_callchain()
1185 } else if (callchain_param.mode == CHAIN_FOLDED) { in hist_browser__show_callchain()
1187 &entry->sorted_chain, row, in hist_browser__show_callchain()
1192 &entry->sorted_chain, level, row, in hist_browser__show_callchain()
1197 if (arg->is_current_entry) in hist_browser__show_callchain()
1198 browser->he_selection = entry; in hist_browser__show_callchain()
1211 struct hpp_arg *arg = hpp->ptr; in __hpp__slsmg_color_printf()
1221 ui_browser__set_percent_color(arg->b, percent, arg->current_entry); in __hpp__slsmg_color_printf()
1223 ret = scnprintf(hpp->buf, hpp->size, fmt, len, percent); in __hpp__slsmg_color_printf()
1224 ui_browser__printf(arg->b, "%s", hpp->buf); in __hpp__slsmg_color_printf()
1232 return he->stat._field; \
1247 return he->stat_acc->_field; \
1256 struct hpp_arg *arg = hpp->ptr; \
1257 int len = fmt->user_len ?: fmt->len; \
1258 int ret = scnprintf(hpp->buf, hpp->size, \
1260 ui_browser__printf(arg->b, "%s", hpp->buf); \
1334 int width = browser->b.width; in hist_browser__show_entry()
1336 bool current_entry = ui_browser__is_current_entry(&browser->b, row); in hist_browser__show_entry()
1338 off_t row_offset = entry->row_offset; in hist_browser__show_entry()
1343 browser->he_selection = entry; in hist_browser__show_entry()
1344 browser->selection = &entry->ms; in hist_browser__show_entry()
1354 .b = &browser->b, in hist_browser__show_entry()
1360 ui_browser__gotorc(&browser->b, row, 0); in hist_browser__show_entry()
1362 hists__for_each_format(browser->hists, fmt) { in hist_browser__show_entry()
1370 if (perf_hpp__should_skip(fmt, entry->hists) || in hist_browser__show_entry()
1371 column++ < browser->b.horiz_scroll) in hist_browser__show_entry()
1374 if (current_entry && browser->b.navkeypressed) { in hist_browser__show_entry()
1375 ui_browser__set_color(&browser->b, in hist_browser__show_entry()
1378 ui_browser__set_color(&browser->b, in hist_browser__show_entry()
1384 ui_browser__printf(&browser->b, "%c ", folded_sign); in hist_browser__show_entry()
1385 width -= 2; in hist_browser__show_entry()
1389 ui_browser__printf(&browser->b, " "); in hist_browser__show_entry()
1390 width -= 2; in hist_browser__show_entry()
1393 if (fmt->color) { in hist_browser__show_entry()
1394 int ret = fmt->color(fmt, &hpp, entry); in hist_browser__show_entry()
1397 * fmt->color() already used ui_browser to in hist_browser__show_entry()
1400 ui_browser__printf(&browser->b, "%s", s + ret); in hist_browser__show_entry()
1402 hist_entry__snprintf_alignment(entry, &hpp, fmt, fmt->entry(fmt, &hpp, entry)); in hist_browser__show_entry()
1403 ui_browser__printf(&browser->b, "%s", s); in hist_browser__show_entry()
1405 width -= hpp.buf - s; in hist_browser__show_entry()
1409 if (!browser->b.navkeypressed) in hist_browser__show_entry()
1412 ui_browser__write_nstring(&browser->b, "", width); in hist_browser__show_entry()
1417 --row_offset; in hist_browser__show_entry()
1419 if (folded_sign == '-' && row != browser->b.rows) { in hist_browser__show_entry()
1441 int width = browser->b.width; in hist_browser__show_hierarchy_entry()
1443 bool current_entry = ui_browser__is_current_entry(&browser->b, row); in hist_browser__show_hierarchy_entry()
1444 off_t row_offset = entry->row_offset; in hist_browser__show_hierarchy_entry()
1449 .b = &browser->b, in hist_browser__show_hierarchy_entry()
1453 int hierarchy_indent = (entry->hists->nr_hpp_node - 2) * HIERARCHY_INDENT; in hist_browser__show_hierarchy_entry()
1456 browser->he_selection = entry; in hist_browser__show_hierarchy_entry()
1457 browser->selection = &entry->ms; in hist_browser__show_hierarchy_entry()
1464 if (entry->leaf && row_offset) { in hist_browser__show_hierarchy_entry()
1465 row_offset--; in hist_browser__show_hierarchy_entry()
1469 ui_browser__gotorc(&browser->b, row, 0); in hist_browser__show_hierarchy_entry()
1471 if (current_entry && browser->b.navkeypressed) in hist_browser__show_hierarchy_entry()
1472 ui_browser__set_color(&browser->b, HE_COLORSET_SELECTED); in hist_browser__show_hierarchy_entry()
1474 ui_browser__set_color(&browser->b, HE_COLORSET_NORMAL); in hist_browser__show_hierarchy_entry()
1476 ui_browser__write_nstring(&browser->b, "", level * HIERARCHY_INDENT); in hist_browser__show_hierarchy_entry()
1477 width -= level * HIERARCHY_INDENT; in hist_browser__show_hierarchy_entry()
1480 fmt_node = list_first_entry(&entry->hists->hpp_formats, in hist_browser__show_hierarchy_entry()
1482 perf_hpp_list__for_each_format(&fmt_node->hpp, fmt) { in hist_browser__show_hierarchy_entry()
1490 if (perf_hpp__should_skip(fmt, entry->hists) || in hist_browser__show_hierarchy_entry()
1491 column++ < browser->b.horiz_scroll) in hist_browser__show_hierarchy_entry()
1494 if (current_entry && browser->b.navkeypressed) { in hist_browser__show_hierarchy_entry()
1495 ui_browser__set_color(&browser->b, in hist_browser__show_hierarchy_entry()
1498 ui_browser__set_color(&browser->b, in hist_browser__show_hierarchy_entry()
1503 ui_browser__printf(&browser->b, "%c ", folded_sign); in hist_browser__show_hierarchy_entry()
1504 width -= 2; in hist_browser__show_hierarchy_entry()
1507 ui_browser__printf(&browser->b, " "); in hist_browser__show_hierarchy_entry()
1508 width -= 2; in hist_browser__show_hierarchy_entry()
1511 if (fmt->color) { in hist_browser__show_hierarchy_entry()
1512 int ret = fmt->color(fmt, &hpp, entry); in hist_browser__show_hierarchy_entry()
1515 * fmt->color() already used ui_browser to in hist_browser__show_hierarchy_entry()
1518 ui_browser__printf(&browser->b, "%s", s + ret); in hist_browser__show_hierarchy_entry()
1520 int ret = fmt->entry(fmt, &hpp, entry); in hist_browser__show_hierarchy_entry()
1522 ui_browser__printf(&browser->b, "%s", s); in hist_browser__show_hierarchy_entry()
1524 width -= hpp.buf - s; in hist_browser__show_hierarchy_entry()
1528 ui_browser__write_nstring(&browser->b, "", hierarchy_indent); in hist_browser__show_hierarchy_entry()
1529 width -= hierarchy_indent; in hist_browser__show_hierarchy_entry()
1532 if (column >= browser->b.horiz_scroll) { in hist_browser__show_hierarchy_entry()
1540 if (current_entry && browser->b.navkeypressed) { in hist_browser__show_hierarchy_entry()
1541 ui_browser__set_color(&browser->b, in hist_browser__show_hierarchy_entry()
1544 ui_browser__set_color(&browser->b, in hist_browser__show_hierarchy_entry()
1548 perf_hpp_list__for_each_format(entry->hpp_list, fmt) { in hist_browser__show_hierarchy_entry()
1550 ui_browser__printf(&browser->b, "%c ", folded_sign); in hist_browser__show_hierarchy_entry()
1553 ui_browser__write_nstring(&browser->b, "", 2); in hist_browser__show_hierarchy_entry()
1556 width -= 2; in hist_browser__show_hierarchy_entry()
1561 * hierarchy mode. in hist_browser__show_hierarchy_entry()
1563 if (fmt->color) { in hist_browser__show_hierarchy_entry()
1564 width -= fmt->color(fmt, &hpp, entry); in hist_browser__show_hierarchy_entry()
1568 width -= fmt->entry(fmt, &hpp, entry); in hist_browser__show_hierarchy_entry()
1569 ui_browser__printf(&browser->b, "%s", skip_spaces(s)); in hist_browser__show_hierarchy_entry()
1578 if (!browser->b.navkeypressed) in hist_browser__show_hierarchy_entry()
1581 ui_browser__write_nstring(&browser->b, "", width); in hist_browser__show_hierarchy_entry()
1587 if (entry->leaf && folded_sign == '-' && row != browser->b.rows) { in hist_browser__show_hierarchy_entry()
1604 int width = browser->b.width; in hist_browser__show_no_entry()
1605 bool current_entry = ui_browser__is_current_entry(&browser->b, row); in hist_browser__show_no_entry()
1611 int indent = browser->hists->nr_hpp_node - 2; in hist_browser__show_no_entry()
1614 browser->he_selection = NULL; in hist_browser__show_no_entry()
1615 browser->selection = NULL; in hist_browser__show_no_entry()
1618 ui_browser__gotorc(&browser->b, row, 0); in hist_browser__show_no_entry()
1620 if (current_entry && browser->b.navkeypressed) in hist_browser__show_no_entry()
1621 ui_browser__set_color(&browser->b, HE_COLORSET_SELECTED); in hist_browser__show_no_entry()
1623 ui_browser__set_color(&browser->b, HE_COLORSET_NORMAL); in hist_browser__show_no_entry()
1625 ui_browser__write_nstring(&browser->b, "", level * HIERARCHY_INDENT); in hist_browser__show_no_entry()
1626 width -= level * HIERARCHY_INDENT; in hist_browser__show_no_entry()
1629 fmt_node = list_first_entry(&browser->hists->hpp_formats, in hist_browser__show_no_entry()
1631 perf_hpp_list__for_each_format(&fmt_node->hpp, fmt) { in hist_browser__show_no_entry()
1632 if (perf_hpp__should_skip(fmt, browser->hists) || in hist_browser__show_no_entry()
1633 column++ < browser->b.horiz_scroll) in hist_browser__show_no_entry()
1636 ret = fmt->width(fmt, NULL, browser->hists); in hist_browser__show_no_entry()
1647 ui_browser__write_nstring(&browser->b, "", ret); in hist_browser__show_no_entry()
1648 width -= ret; in hist_browser__show_no_entry()
1651 ui_browser__write_nstring(&browser->b, "", indent * HIERARCHY_INDENT); in hist_browser__show_no_entry()
1652 width -= indent * HIERARCHY_INDENT; in hist_browser__show_no_entry()
1654 if (column >= browser->b.horiz_scroll) { in hist_browser__show_no_entry()
1657 ret = snprintf(buf, sizeof(buf), "no entry >= %.2f%%", browser->min_pcnt); in hist_browser__show_no_entry()
1658 ui_browser__printf(&browser->b, " %s", buf); in hist_browser__show_no_entry()
1659 width -= ret + 2; in hist_browser__show_no_entry()
1663 if (!browser->b.navkeypressed) in hist_browser__show_no_entry()
1666 ui_browser__write_nstring(&browser->b, "", width); in hist_browser__show_no_entry()
1673 return hpp->size <= 0; in advance_hpp_check()
1680 struct hists *hists = browser->hists; in hists_browser__scnprintf_headers()
1696 hists__for_each_format(browser->hists, fmt) { in hists_browser__scnprintf_headers()
1697 if (perf_hpp__should_skip(fmt, hists) || column++ < browser->b.horiz_scroll) in hists_browser__scnprintf_headers()
1700 ret = fmt->header(fmt, &dummy_hpp, hists, line, &span); in hists_browser__scnprintf_headers()
1718 struct hists *hists = browser->hists; in hists_browser__scnprintf_hierarchy_headers()
1727 int indent = hists->nr_hpp_node - 2; in hists_browser__scnprintf_hierarchy_headers()
1736 fmt_node = list_first_entry(&hists->hpp_formats, in hists_browser__scnprintf_hierarchy_headers()
1738 perf_hpp_list__for_each_format(&fmt_node->hpp, fmt) { in hists_browser__scnprintf_hierarchy_headers()
1739 if (column++ < browser->b.horiz_scroll) in hists_browser__scnprintf_hierarchy_headers()
1742 ret = fmt->header(fmt, &dummy_hpp, hists, line, NULL); in hists_browser__scnprintf_hierarchy_headers()
1753 if (line < hists->hpp_list->nr_header_lines - 1) in hists_browser__scnprintf_hierarchy_headers()
1764 list_for_each_entry_continue(fmt_node, &hists->hpp_formats, list) { in hists_browser__scnprintf_hierarchy_headers()
1773 perf_hpp_list__for_each_format(&fmt_node->hpp, fmt) { in hists_browser__scnprintf_hierarchy_headers()
1786 ret = fmt->header(fmt, &dummy_hpp, hists, line, NULL); in hists_browser__scnprintf_hierarchy_headers()
1805 struct perf_hpp_list *hpp_list = browser->hists->hpp_list; in hists_browser__hierarchy_headers()
1809 for (line = 0; line < hpp_list->nr_header_lines; line++) { in hists_browser__hierarchy_headers()
1813 ui_browser__gotorc_title(&browser->b, line, 0); in hists_browser__hierarchy_headers()
1814 ui_browser__set_color(&browser->b, HE_COLORSET_ROOT); in hists_browser__hierarchy_headers()
1815 ui_browser__write_nstring(&browser->b, headers, browser->b.width + 1); in hists_browser__hierarchy_headers()
1821 struct hists *hists = browser->hists; in hists_browser__headers()
1822 struct perf_hpp_list *hpp_list = hists->hpp_list; in hists_browser__headers()
1826 for (line = 0; line < hpp_list->nr_header_lines; line++) { in hists_browser__headers()
1832 ui_browser__gotorc_title(&browser->b, line, 0); in hists_browser__headers()
1833 ui_browser__set_color(&browser->b, HE_COLORSET_ROOT); in hists_browser__headers()
1834 ui_browser__write_nstring(&browser->b, headers, browser->b.width + 1); in hists_browser__headers()
1848 if (browser->top == NULL) { in ui_browser__hists_init_top()
1852 browser->top = rb_first_cached(&hb->hists->entries); in ui_browser__hists_init_top()
1862 if (hb->show_headers) in hist_browser__refresh()
1866 hb->he_selection = NULL; in hist_browser__refresh()
1867 hb->selection = NULL; in hist_browser__refresh()
1869 for (nd = browser->top; nd; nd = rb_hierarchy_next(nd)) { in hist_browser__refresh()
1873 if (h->filtered) { in hist_browser__refresh()
1875 h->unfolded = false; in hist_browser__refresh()
1884 if (percent < hb->min_pcnt) in hist_browser__refresh()
1889 h->depth); in hist_browser__refresh()
1890 if (row == browser->rows) in hist_browser__refresh()
1893 if (h->has_no_entry) { in hist_browser__refresh()
1894 hist_browser__show_no_entry(hb, row, h->depth + 1); in hist_browser__refresh()
1901 if (row == browser->rows) in hist_browser__refresh()
1915 if (!h->filtered && percent >= min_pcnt) in hists__filter_entries()
1938 if (!h->filtered && percent >= min_pcnt) in hists__filter_prev_entries()
1957 if (browser->nr_entries == 0) in ui_browser__hists_seek()
1964 nd = hists__filter_entries(rb_first(browser->entries), in ui_browser__hists_seek()
1965 hb->min_pcnt); in ui_browser__hists_seek()
1968 nd = browser->top; in ui_browser__hists_seek()
1971 nd = rb_hierarchy_last(rb_last(browser->entries)); in ui_browser__hists_seek()
1972 nd = hists__filter_prev_entries(nd, hb->min_pcnt); in ui_browser__hists_seek()
1983 h = rb_entry(browser->top, struct hist_entry, rb_node); in ui_browser__hists_seek()
1984 h->row_offset = 0; in ui_browser__hists_seek()
2006 if (h->unfolded && h->leaf) { in ui_browser__hists_seek()
2007 u16 remaining = h->nr_rows - h->row_offset; in ui_browser__hists_seek()
2009 offset -= remaining; in ui_browser__hists_seek()
2010 h->row_offset = 0; in ui_browser__hists_seek()
2012 h->row_offset += offset; in ui_browser__hists_seek()
2014 browser->top = nd; in ui_browser__hists_seek()
2019 hb->min_pcnt); in ui_browser__hists_seek()
2022 --offset; in ui_browser__hists_seek()
2023 browser->top = nd; in ui_browser__hists_seek()
2028 if (h->unfolded && h->leaf) { in ui_browser__hists_seek()
2030 if (-offset > h->row_offset) { in ui_browser__hists_seek()
2031 offset += h->row_offset; in ui_browser__hists_seek()
2032 h->row_offset = 0; in ui_browser__hists_seek()
2034 h->row_offset += offset; in ui_browser__hists_seek()
2036 browser->top = nd; in ui_browser__hists_seek()
2040 if (-offset > h->nr_rows) { in ui_browser__hists_seek()
2041 offset += h->nr_rows; in ui_browser__hists_seek()
2042 h->row_offset = 0; in ui_browser__hists_seek()
2044 h->row_offset = h->nr_rows + offset; in ui_browser__hists_seek()
2046 browser->top = nd; in ui_browser__hists_seek()
2053 hb->min_pcnt); in ui_browser__hists_seek()
2057 browser->top = nd; in ui_browser__hists_seek()
2065 if (h->unfolded && h->leaf) in ui_browser__hists_seek()
2066 h->row_offset = h->nr_rows; in ui_browser__hists_seek()
2072 browser->top = nd; in ui_browser__hists_seek()
2074 h->row_offset = 0; in ui_browser__hists_seek()
2111 hists__for_each_format(browser->hists, fmt) { in hist_browser__fprintf_entry()
2112 if (perf_hpp__should_skip(fmt, he->hists)) in hist_browser__fprintf_entry()
2121 ret = fmt->entry(fmt, &hpp, he); in hist_browser__fprintf_entry()
2127 if (folded_sign == '-') in hist_browser__fprintf_entry()
2149 int hierarchy_indent = (he->hists->nr_hpp_node - 2) * HIERARCHY_INDENT; in hist_browser__fprintf_hierarchy_entry()
2157 fmt_node = list_first_entry(&he->hists->hpp_formats, in hist_browser__fprintf_hierarchy_entry()
2159 perf_hpp_list__for_each_format(&fmt_node->hpp, fmt) { in hist_browser__fprintf_hierarchy_entry()
2166 ret = fmt->entry(fmt, &hpp, he); in hist_browser__fprintf_hierarchy_entry()
2173 perf_hpp_list__for_each_format(he->hpp_list, fmt) { in hist_browser__fprintf_hierarchy_entry()
2177 ret = fmt->entry(fmt, &hpp, he); in hist_browser__fprintf_hierarchy_entry()
2184 if (he->leaf && folded_sign == '-') { in hist_browser__fprintf_hierarchy_entry()
2186 he->depth + 1); in hist_browser__fprintf_hierarchy_entry()
2194 struct rb_node *nd = hists__filter_entries(rb_first(browser->b.entries), in hist_browser__fprintf()
2195 browser->min_pcnt); in hist_browser__fprintf()
2204 h->depth); in hist_browser__fprintf()
2210 browser->min_pcnt); in hist_browser__fprintf()
2222 scnprintf(filename, sizeof(filename), "perf.hist.%d", browser->print_seq); in hist_browser__dump()
2228 if (++browser->print_seq == 8192) { in hist_browser__dump()
2230 return -1; in hist_browser__dump()
2239 return -1; in hist_browser__dump()
2242 ++browser->print_seq; in hist_browser__dump()
2255 browser->hists = hists; in hist_browser__init()
2256 browser->b.refresh = hist_browser__refresh; in hist_browser__init()
2257 browser->b.refresh_dimensions = hist_browser__refresh_dimensions; in hist_browser__init()
2258 browser->b.seek = ui_browser__hists_seek; in hist_browser__init()
2259 browser->b.use_navkeypressed = true; in hist_browser__init()
2260 browser->show_headers = symbol_conf.show_hist_headers; in hist_browser__init()
2267 fmt_node = list_first_entry(&hists->hpp_formats, in hist_browser__init()
2269 perf_hpp_list__for_each_format(&fmt_node->hpp, fmt) in hist_browser__init()
2270 ++browser->b.columns; in hist_browser__init()
2273 ++browser->b.columns; in hist_browser__init()
2276 ++browser->b.columns; in hist_browser__init()
2300 browser->hbt = hbt; in perf_evsel_browser__new()
2301 browser->env = env; in perf_evsel_browser__new()
2302 browser->title = hists_browser__scnprintf_title; in perf_evsel_browser__new()
2314 return browser->he_selection; in hist_browser__selected_entry()
2319 return browser->he_selection->thread; in hist_browser__selected_thread()
2324 return browser->he_selection ? browser->he_selection->res_samples : NULL; in hist_browser__selected_res_sample()
2335 struct hist_browser_timer *hbt = browser->hbt; in hists_browser__scnprintf_title()
2336 int printed = __hists__scnprintf_title(browser->hists, bf, size, !is_report_browser(hbt)); in hists_browser__scnprintf_title()
2339 struct perf_top *top = hbt->arg; in hists_browser__scnprintf_title()
2341 printed += scnprintf(bf + printed, size - printed, in hists_browser__scnprintf_title()
2343 top->lost, top->lost_total); in hists_browser__scnprintf_title()
2345 printed += scnprintf(bf + printed, size - printed, in hists_browser__scnprintf_title()
2347 top->drop, top->drop_total); in hists_browser__scnprintf_title()
2349 if (top->zero) in hists_browser__scnprintf_title()
2350 printed += scnprintf(bf + printed, size - printed, " [z]"); in hists_browser__scnprintf_title()
2378 int nr_options = 0, choice = -1, ret = -1; in switch_data_file()
2395 char *name = dent->d_name; in switch_data_file()
2398 if (!(dent->d_type == DT_REG)) in switch_data_file()
2457 unsigned long time;
2475 perf_env__lookup_objdump(browser->env, &annotate_opts.objdump_path)) in do_annotate()
2478 notes = symbol__annotation(act->ms.sym); in do_annotate()
2479 if (!notes->src) in do_annotate()
2482 if (browser->block_evsel) in do_annotate()
2483 evsel = browser->block_evsel; in do_annotate()
2485 evsel = hists_to_evsel(browser->hists); in do_annotate()
2488 err = __hist_entry__tui_annotate(he, &act->ms, evsel, browser->hbt); in do_annotate()
2493 if ((err == 'q' || err == CTRL('c')) && he->branch_info) in do_annotate()
2496 ui_browser__update_nr_entries(&browser->b, browser->hists->nr_entries); in do_annotate()
2498 ui_browser__handle_resize(&browser->b); in do_annotate()
2531 if (!ms->map || (dso = map__dso(ms->map)) == NULL || dso__annotate_warned(dso)) in add_annotate_opt()
2534 if (!ms->sym) in add_annotate_opt()
2535 ms->sym = symbol__new_unresolved(addr, ms->map); in add_annotate_opt()
2537 if (ms->sym == NULL || symbol__annotation(ms->sym)->src == NULL) in add_annotate_opt()
2540 if (asprintf(optstr, "Annotate %s", ms->sym->name) < 0) in add_annotate_opt()
2543 act->ms = *ms; in add_annotate_opt()
2544 act->fn = do_annotate; in add_annotate_opt()
2551 struct hist_entry *he = browser->he_selection; in do_annotate_type()
2553 hist_entry__annotate_data_tui(he, hists_to_evsel(browser->hists), browser->hbt); in do_annotate_type()
2554 ui_browser__handle_resize(&browser->b); in do_annotate_type()
2562 if (he == NULL || he->mem_type == NULL || he->mem_type->histograms == NULL) in add_annotate_type_opt()
2565 if (asprintf(optstr, "Annotate type %s", he->mem_type->self.type_name) < 0) in add_annotate_type_opt()
2568 act->fn = do_annotate_type; in add_annotate_type_opt()
2575 struct thread *thread = act->thread; in do_zoom_thread()
2577 if ((!hists__has(browser->hists, thread) && in do_zoom_thread()
2578 !hists__has(browser->hists, comm)) || thread == NULL) in do_zoom_thread()
2581 if (browser->hists->thread_filter) { in do_zoom_thread()
2582 pstack__remove(browser->pstack, &browser->hists->thread_filter); in do_zoom_thread()
2584 thread__zput(browser->hists->thread_filter); in do_zoom_thread()
2590 if (hists__has(browser->hists, thread)) { in do_zoom_thread()
2591 ui_helpline__fpush("To zoom out press ESC or ENTER + \"Zoom out of %s(%d) thread\"", in do_zoom_thread()
2594 ui_helpline__fpush("To zoom out press ESC or ENTER + \"Zoom out of %s thread\"", in do_zoom_thread()
2598 browser->hists->thread_filter = thread__get(thread); in do_zoom_thread()
2600 pstack__push(browser->pstack, &browser->hists->thread_filter); in do_zoom_thread()
2603 hists__filter_by_thread(browser->hists); in do_zoom_thread()
2615 if ((!hists__has(browser->hists, thread) && in add_thread_opt()
2616 !hists__has(browser->hists, comm)) || thread == NULL) in add_thread_opt()
2619 in_out = browser->hists->thread_filter ? "out of" : "into"; in add_thread_opt()
2621 if (hists__has(browser->hists, thread)) { in add_thread_opt()
2630 act->thread = thread; in add_thread_opt()
2631 act->fn = do_zoom_thread; in add_thread_opt()
2637 if (!hists__has(browser->hists, dso) || map == NULL) in hists_browser__zoom_map()
2640 if (browser->hists->dso_filter) { in hists_browser__zoom_map()
2641 pstack__remove(browser->pstack, &browser->hists->dso_filter); in hists_browser__zoom_map()
2643 browser->hists->dso_filter = NULL; in hists_browser__zoom_map()
2647 ui_helpline__fpush("To zoom out press ESC or ENTER + \"Zoom out of %s DSO\"", in hists_browser__zoom_map()
2649 browser->hists->dso_filter = dso; in hists_browser__zoom_map()
2651 pstack__push(browser->pstack, &browser->hists->dso_filter); in hists_browser__zoom_map()
2654 hists__filter_by_dso(browser->hists); in hists_browser__zoom_map()
2662 return hists_browser__zoom_map(browser, act->ms.map); in do_zoom_dso()
2669 if (!hists__has(browser->hists, dso) || map == NULL) in add_dso_opt()
2673 browser->hists->dso_filter ? "out of" : "into", in add_dso_opt()
2677 act->ms.map = map; in add_dso_opt()
2678 act->fn = do_zoom_dso; in add_dso_opt()
2700 act->fn = do_toggle_callchain; in add_callchain_toggle_opt()
2708 map__browse(act->ms.map); in do_browse_map()
2716 if (!hists__has(browser->hists, dso) || map == NULL) in add_map_opt()
2722 act->ms.map = map; in add_map_opt()
2723 act->fn = do_browse_map; in add_map_opt()
2736 if (act->thread) in do_run_script()
2737 len += strlen(thread__comm_str(act->thread)); in do_run_script()
2738 else if (act->ms.sym) in do_run_script()
2739 len += strlen(act->ms.sym->name); in do_run_script()
2742 return -1; in do_run_script()
2745 if (act->thread) { in do_run_script()
2746 n = scnprintf(script_opt, len, " -c %s ", in do_run_script()
2747 thread__comm_str(act->thread)); in do_run_script()
2748 } else if (act->ms.sym) { in do_run_script()
2749 n = scnprintf(script_opt, len, " -S %s ", in do_run_script()
2750 act->ms.sym->name); in do_run_script()
2753 if (act->time) { in do_run_script()
2755 unsigned long starttime = act->time; in do_run_script()
2756 unsigned long endtime = act->time + symbol_conf.time_quantum; in do_run_script()
2759 starttime -= 1*NSEC_PER_MSEC; in do_run_script()
2764 n += snprintf(script_opt + n, len - n, " --time %s,%s", start, end); in do_run_script()
2767 script_browse(script_opt, hists_to_evsel(browser->hists)); in do_run_script()
2779 res_sample_browse(he->res_samples, he->num_res, hists_to_evsel(browser->hists), act->rstype); in do_res_sample_script()
2795 sym->name, tstr) < 0) in add_script_opt_2()
2802 act->thread = thread; in add_script_opt_2()
2803 act->ms.sym = sym; in add_script_opt_2()
2804 act->fn = do_run_script; in add_script_opt_2()
2825 j += timestamp__scnprintf_usec(he->time, tstr + j, in add_script_opt()
2826 sizeof tstr - j); in add_script_opt()
2827 j += sprintf(tstr + j, "-"); in add_script_opt()
2828 timestamp__scnprintf_usec(he->time + symbol_conf.time_quantum, in add_script_opt()
2829 tstr + j, sizeof tstr - j); in add_script_opt()
2831 act->time = he->time; in add_script_opt()
2850 act->fn = do_res_sample_script; in add_res_sample_opt()
2851 act->rstype = type; in add_res_sample_opt()
2872 if (!is_report_browser(browser->hbt)) in add_switch_opt()
2878 act->fn = do_switch_data; in add_switch_opt()
2896 act->fn = do_exit_browser; in add_exit_opt()
2903 if (!hists__has(browser->hists, socket) || act->socket < 0) in do_zoom_socket()
2906 if (browser->hists->socket_filter > -1) { in do_zoom_socket()
2907 pstack__remove(browser->pstack, &browser->hists->socket_filter); in do_zoom_socket()
2908 browser->hists->socket_filter = -1; in do_zoom_socket()
2911 browser->hists->socket_filter = act->socket; in do_zoom_socket()
2913 pstack__push(browser->pstack, &browser->hists->socket_filter); in do_zoom_socket()
2916 hists__filter_by_socket(browser->hists); in do_zoom_socket()
2925 if (!hists__has(browser->hists, socket) || socket_id < 0) in add_socket_opt()
2929 (browser->hists->socket_filter > -1) ? "out of" : "into", in add_socket_opt()
2933 act->socket = socket_id; in add_socket_opt()
2934 act->fn = do_zoom_socket; in add_socket_opt()
2941 struct rb_node *nd = rb_first_cached(&hb->hists->entries); in hist_browser__update_nr_entries()
2943 if (hb->min_pcnt == 0 && !symbol_conf.report_hierarchy) { in hist_browser__update_nr_entries()
2944 hb->nr_non_filtered_entries = hb->hists->nr_non_filtered_entries; in hist_browser__update_nr_entries()
2948 while ((nd = hists__filter_entries(nd, hb->min_pcnt)) != NULL) { in hist_browser__update_nr_entries()
2953 hb->nr_non_filtered_entries = nr_entries; in hist_browser__update_nr_entries()
2954 hb->nr_hierarchy_entries = nr_entries; in hist_browser__update_nr_entries()
2961 struct rb_node *nd = rb_first_cached(&hb->hists->entries); in hist_browser__update_percent_limit()
2962 u64 total = hists__total_period(hb->hists); in hist_browser__update_percent_limit()
2965 hb->min_pcnt = callchain_param.min_percent = percent; in hist_browser__update_percent_limit()
2967 while ((nd = hists__filter_entries(nd, hb->min_pcnt)) != NULL) { in hist_browser__update_percent_limit()
2970 if (he->has_no_entry) { in hist_browser__update_percent_limit()
2971 he->has_no_entry = false; in hist_browser__update_percent_limit()
2972 he->nr_rows = 0; in hist_browser__update_percent_limit()
2975 if (!he->leaf || !hist_entry__has_callchains(he) || !symbol_conf.use_callchain) in hist_browser__update_percent_limit()
2978 if (callchain_param.mode == CHAIN_GRAPH_REL) { in hist_browser__update_percent_limit()
2979 total = he->stat.period; in hist_browser__update_percent_limit()
2982 total = he->stat_acc->period; in hist_browser__update_percent_limit()
2987 callchain_param.sort(&he->sorted_chain, he->callchain, in hist_browser__update_percent_limit()
2993 /* force to re-evaluate folding state of callchains */ in hist_browser__update_percent_limit()
2994 he->init_have_children = false; in hist_browser__update_percent_limit()
3010 int key = -1; in evsel__hists_browse()
3012 int delay_secs = hbt ? hbt->refresh : 0; in evsel__hists_browse()
3021 "For symbolic views (--sort has sym):\n\n" \ in evsel__hists_browse()
3046 "0-9 Sort by event n in group"; in evsel__hists_browse()
3056 return -1; in evsel__hists_browse()
3058 /* reset abort key so that it can get Ctrl-C as a key */ in evsel__hists_browse()
3064 browser->min_pcnt = min_pcnt; in evsel__hists_browse()
3067 browser->pstack = pstack__new(3); in evsel__hists_browse()
3068 if (browser->pstack == NULL) in evsel__hists_browse()
3080 browser->b.no_samples_msg = "Collecting samples..."; in evsel__hists_browse()
3086 int socked_id = -1; in evsel__hists_browse()
3093 if (browser->he_selection != NULL) { in evsel__hists_browse()
3095 map = browser->selection->map; in evsel__hists_browse()
3096 socked_id = browser->he_selection->socket; in evsel__hists_browse()
3110 evsel->core.nr_members < 2) { in evsel__hists_browse()
3117 if (key - '0' == symbol_conf.group_sort_idx) in evsel__hists_browse()
3120 symbol_conf.group_sort_idx = key - '0'; in evsel__hists_browse()
3122 if (symbol_conf.group_sort_idx >= evsel->core.nr_members) { in evsel__hists_browse()
3125 evsel->core.nr_members - 1, in evsel__hists_browse()
3126 evsel->core.nr_members - 1); in evsel__hists_browse()
3135 ui_browser__warning(&browser->b, delay_secs * 2, in evsel__hists_browse()
3137 "include \"sym*\" in --sort to use it."); in evsel__hists_browse()
3141 if (!browser->selection || in evsel__hists_browse()
3142 !browser->selection->map || in evsel__hists_browse()
3143 !map__dso(browser->selection->map) || in evsel__hists_browse()
3144 dso__annotate_warned(map__dso(browser->selection->map))) { in evsel__hists_browse()
3148 if (!browser->selection->sym) { in evsel__hists_browse()
3149 if (!browser->he_selection) in evsel__hists_browse()
3153 bi = browser->he_selection->branch_info; in evsel__hists_browse()
3154 if (!bi || !bi->to.ms.map) in evsel__hists_browse()
3157 actions->ms.sym = symbol__new_unresolved(bi->to.al_addr, bi->to.ms.map); in evsel__hists_browse()
3158 actions->ms.map = bi->to.ms.map; in evsel__hists_browse()
3160 actions->ms.sym = symbol__new_unresolved(browser->he_selection->ip, in evsel__hists_browse()
3161 browser->selection->map); in evsel__hists_browse()
3162 actions->ms.map = browser->selection->map; in evsel__hists_browse()
3165 if (!actions->ms.sym) in evsel__hists_browse()
3168 if (symbol__annotation(browser->selection->sym)->src == NULL) { in evsel__hists_browse()
3169 ui_browser__warning(&browser->b, delay_secs * 2, in evsel__hists_browse()
3172 browser->selection->sym->name); in evsel__hists_browse()
3176 actions->ms.map = browser->selection->map; in evsel__hists_browse()
3177 actions->ms.sym = browser->selection->sym; in evsel__hists_browse()
3186 actions->ms.map = map; in evsel__hists_browse()
3190 if (browser->selection != NULL) in evsel__hists_browse()
3192 maps__machine(browser->selection->maps)->vmlinux_map); in evsel__hists_browse()
3196 browser->show_dso = verbose > 0; in evsel__hists_browse()
3201 actions->thread = thread; in evsel__hists_browse()
3205 actions->socket = socked_id; in evsel__hists_browse()
3211 "To remove the filter later, press / + ENTER.", in evsel__hists_browse()
3214 hists->symbol_filter_str = *buf ? buf : NULL; in evsel__hists_browse()
3221 actions->thread = NULL; in evsel__hists_browse()
3222 actions->ms.sym = NULL; in evsel__hists_browse()
3234 /* env->arch is NULL for live-mode (i.e. perf top) */ in evsel__hists_browse()
3235 if (env->arch) in evsel__hists_browse()
3243 struct perf_top *top = hbt->arg; in evsel__hists_browse()
3245 top->zero = !top->zero; in evsel__hists_browse()
3257 ui_browser__warning(&browser->b, delay_secs * 2, in evsel__hists_browse()
3269 ui_browser__help_window(&browser->b, in evsel__hists_browse()
3281 if (pstack__empty(browser->pstack)) { in evsel__hists_browse()
3289 ui_browser__dialog_yesno(&browser->b, in evsel__hists_browse()
3295 actions->ms.map = map; in evsel__hists_browse()
3296 top = pstack__peek(browser->pstack); in evsel__hists_browse()
3297 if (top == &browser->hists->dso_filter) { in evsel__hists_browse()
3299 * No need to set actions->dso here since in evsel__hists_browse()
3303 } else if (top == &browser->hists->thread_filter) { in evsel__hists_browse()
3304 actions->thread = thread; in evsel__hists_browse()
3306 } else if (top == &browser->hists->socket_filter) { in evsel__hists_browse()
3316 struct perf_top *top = hbt->arg; in evsel__hists_browse()
3318 evlist__toggle_enable(top->evlist); in evsel__hists_browse()
3323 if (top->evlist->enabled) { in evsel__hists_browse()
3324 helpline = "Press 'f' to disable the events or 'h' to see other hotkeys"; in evsel__hists_browse()
3325 hbt->refresh = delay_secs; in evsel__hists_browse()
3327 helpline = "Press 'f' again to re-enable the events"; in evsel__hists_browse()
3328 hbt->refresh = 0; in evsel__hists_browse()
3334 helpline = "Press '?' for help on key bindings"; in evsel__hists_browse()
3335 ui_browser__warn_unhandled_hotkey(&browser->b, key, delay_secs, in evsel__hists_browse()
3340 if (!hists__has(hists, sym) || browser->selection == NULL) in evsel__hists_browse()
3345 if (browser->he_selection) in evsel__hists_browse()
3346 bi = browser->he_selection->branch_info; in evsel__hists_browse()
3353 &bi->from.ms, in evsel__hists_browse()
3354 bi->from.al_addr); in evsel__hists_browse()
3355 if (bi->to.ms.sym != bi->from.ms.sym) in evsel__hists_browse()
3358 &bi->to.ms, in evsel__hists_browse()
3359 bi->to.al_addr); in evsel__hists_browse()
3360 } else if (browser->he_selection) { in evsel__hists_browse()
3363 browser->selection, in evsel__hists_browse()
3364 browser->he_selection->ip); in evsel__hists_browse()
3369 browser->he_selection); in evsel__hists_browse()
3377 browser->selection ? in evsel__hists_browse()
3378 browser->selection->map : NULL); in evsel__hists_browse()
3386 if (browser->he_selection) { in evsel__hists_browse()
3394 * Note that browser->selection != NULL in evsel__hists_browse()
3395 * when browser->he_selection is not NULL, in evsel__hists_browse()
3396 * so we don't need to check browser->selection in evsel__hists_browse()
3397 * before fetching browser->selection->sym like what in evsel__hists_browse()
3398 * we do before fetching browser->selection->map. in evsel__hists_browse()
3402 if (hists__has(hists, sym) && browser->selection->sym) { in evsel__hists_browse()
3406 NULL, browser->selection->sym); in evsel__hists_browse()
3433 if (choice == -1) in evsel__hists_browse()
3440 key = act->fn(browser, act); in evsel__hists_browse()
3447 pstack__delete(browser->pstack); in evsel__hists_browse()
3470 unsigned long nr_events = hists->stats.nr_samples; in perf_evsel_menu__write()
3486 nr_events += pos_hists->stats.nr_samples; in perf_evsel_menu__write()
3495 nr_events = evsel->evlist->stats.nr_events[PERF_RECORD_LOST]; in perf_evsel_menu__write()
3497 menu->lost_events = true; in perf_evsel_menu__write()
3506 ui_browser__write_nstring(browser, warn, browser->width - printed); in perf_evsel_menu__write()
3509 menu->selection = evsel; in perf_evsel_menu__write()
3517 struct evlist *evlist = menu->b.priv; in perf_evsel_menu__run()
3520 int delay_secs = hbt ? hbt->refresh : 0; in perf_evsel_menu__run()
3523 if (ui_browser__show(&menu->b, title, in perf_evsel_menu__run()
3524 "ESC: exit, ENTER|->: Browse histograms") < 0) in perf_evsel_menu__run()
3525 return -1; in perf_evsel_menu__run()
3528 key = ui_browser__run(&menu->b, delay_secs); in perf_evsel_menu__run()
3533 hbt->timer(hbt->arg); in perf_evsel_menu__run()
3535 if (!menu->lost_events_warned && in perf_evsel_menu__run()
3536 menu->lost_events && in perf_evsel_menu__run()
3538 ui_browser__warn_lost_events(&menu->b); in perf_evsel_menu__run()
3539 menu->lost_events_warned = true; in perf_evsel_menu__run()
3544 if (!menu->selection) in perf_evsel_menu__run()
3546 pos = menu->selection; in perf_evsel_menu__run()
3554 hbt->timer(hbt->arg); in perf_evsel_menu__run()
3556 menu->min_pcnt, menu->env, in perf_evsel_menu__run()
3558 ui_browser__show_title(&menu->b, title); in perf_evsel_menu__run()
3561 if (pos->core.node.next == &evlist->core.entries) in perf_evsel_menu__run()
3567 if (pos->core.node.prev == &evlist->core.entries) in perf_evsel_menu__run()
3584 if (!ui_browser__dialog_yesno(&menu->b, in perf_evsel_menu__run()
3592 ui_browser__warn_unhandled_hotkey(&menu->b, key, delay_secs, NULL); in perf_evsel_menu__run()
3598 ui_browser__hide(&menu->b); in perf_evsel_menu__run()
3620 .entries = &evlist->core.entries, in __evlist__tui_browse_hists()
3632 ui_helpline__push("Press ESC to exit"); in __evlist__tui_browse_hists()
3648 int nr_entries = evlist->core.nr_entries; in evlist__single_entry()
3666 int nr_entries = evlist->core.nr_entries; in evlist__tui_browse_hists()
3697 struct hists *hists = evsel__hists(browser->block_evsel); in block_hists_browser__title()
3698 const char *evname = evsel__name(browser->block_evsel); in block_hists_browser__title()
3699 unsigned long nr_samples = hists->stats.nr_samples; in block_hists_browser__title()
3704 scnprintf(bf + ret, size - ret, " of event '%s'", evname); in block_hists_browser__title()
3712 struct hists *hists = &bh->block_hists; in block_hists_tui_browse()
3714 int key = -1; in block_hists_tui_browse()
3723 return -1; in block_hists_tui_browse()
3725 browser->block_evsel = evsel; in block_hists_tui_browse()
3726 browser->title = block_hists_browser__title; in block_hists_tui_browse()
3727 browser->min_pcnt = min_percent; in block_hists_tui_browse()
3728 browser->env = env; in block_hists_tui_browse()
3730 /* reset abort key so that it can get Ctrl-C as a key */ in block_hists_tui_browse()
3741 key = hist_browser__run(browser, "? - help", true, 0); in block_hists_tui_browse()
3748 ui_browser__help_window(&browser->b, help); in block_hists_tui_browse()
3752 if (!browser->selection || in block_hists_tui_browse()
3753 !browser->selection->sym) { in block_hists_tui_browse()
3757 action.ms.map = browser->selection->map; in block_hists_tui_browse()
3758 action.ms.sym = browser->selection->sym; in block_hists_tui_browse()
3764 br_cntr_text, "Press any key...", 0); in block_hists_tui_browse()
3768 "Press any key...", 0); in block_hists_tui_browse()
3772 ui_browser__warn_unhandled_hotkey(&browser->b, key, 0, in block_hists_tui_browse()