Messages in this thread Patch in this message | | | From | Namhyung Kim <> | Subject | [PATCH 11/23] perf hists: Add helper functions for hierarchy mode | Date | Fri, 5 Feb 2016 22:01:43 +0900 |
| |
The rb_hierarchy_{next,prev,last} functions are to traverse all hist entries in a hierarchy. They will be used by various function which supports hierarchy output.
Acked-by: Pekka Enberg <penberg@kernel.org> Signed-off-by: Namhyung Kim <namhyung@kernel.org> --- tools/perf/util/hist.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/hist.h | 4 ++++ 2 files changed, 50 insertions(+)
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index c00183558e22..def0120d57ab 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c @@ -1440,6 +1440,7 @@ static void output_resort(struct hists *hists, struct ui_progress *prog, } } + void perf_evsel__output_resort(struct perf_evsel *evsel, struct ui_progress *prog) { bool use_callchain; @@ -1457,6 +1458,51 @@ void hists__output_resort(struct hists *hists, struct ui_progress *prog) output_resort(hists, prog, symbol_conf.use_callchain); } +struct rb_node *rb_hierarchy_last(struct rb_node *node) +{ + struct hist_entry *he = rb_entry(node, struct hist_entry, rb_node); + + while (he->unfolded && !he->leaf) { + node = rb_last(&he->hroot_out); + he = rb_entry(node, struct hist_entry, rb_node); + } + return node; +} + +struct rb_node *rb_hierarchy_next(struct rb_node *node) +{ + struct hist_entry *he = rb_entry(node, struct hist_entry, rb_node); + + if (!he->leaf && he->unfolded) + node = rb_first(&he->hroot_out); + else + node = rb_next(node); + + while (node == NULL) { + he = he->parent_he; + if (he == NULL) + break; + + node = rb_next(&he->rb_node); + } + return node; +} + +struct rb_node *rb_hierarchy_prev(struct rb_node *node) +{ + struct hist_entry *he = rb_entry(node, struct hist_entry, rb_node); + + node = rb_prev(node); + if (node) + return rb_hierarchy_last(node); + + he = he->parent_he; + if (he == NULL) + return NULL; + + return &he->rb_node; +} + static void hists__remove_entry_filter(struct hists *hists, struct hist_entry *h, enum hist_filter filter) { diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h index b86c98c6dffd..adfc9931e186 100644 --- a/tools/perf/util/hist.h +++ b/tools/perf/util/hist.h @@ -410,4 +410,8 @@ int perf_hist_config(const char *var, const char *value); void perf_hpp_list__init(struct perf_hpp_list *list); +struct rb_node *rb_hierarchy_last(struct rb_node *node); +struct rb_node *rb_hierarchy_next(struct rb_node *node); +struct rb_node *rb_hierarchy_prev(struct rb_node *node); + #endif /* __PERF_HIST_H */ -- 2.7.0
| |