From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757597AbcAUETf (ORCPT ); Wed, 20 Jan 2016 23:19:35 -0500 Received: from LGEAMRELO13.lge.com ([156.147.23.53]:58120 "EHLO lgeamrelo13.lge.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757429AbcAUETd (ORCPT ); Wed, 20 Jan 2016 23:19:33 -0500 X-Original-SENDERIP: 156.147.1.125 X-Original-MAILFROM: namhyung@kernel.org X-Original-SENDERIP: 10.177.227.17 X-Original-MAILFROM: namhyung@kernel.org From: Namhyung Kim To: Arnaldo Carvalho de Melo Cc: Ingo Molnar , Peter Zijlstra , Jiri Olsa , LKML , David Ahern , Stephane Eranian , Andi Kleen , Wang Nan Subject: [PATCH v2 03/17] perf hists: Add helper functions for hierarchy mode Date: Thu, 21 Jan 2016 13:19:31 +0900 Message-Id: <1453349971-12418-1-git-send-email-namhyung@kernel.org> X-Mailer: git-send-email 2.7.0 In-Reply-To: <20160121035907.GA10179@sejong> References: <20160121035907.GA10179@sejong> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The rb_hierarchy_{first,last,next,prev} functions are to traverse all hist entries in a hierarchy. They will be used by various function which supports hierarchy output. Signed-off-by: Namhyung Kim --- removed rb_hierarchy_first(). tools/perf/util/hist.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/hist.h | 8 ++++++++ 2 files changed, 53 insertions(+) diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index 931353f49c72..e9eff7c4bbaf 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c @@ -1390,6 +1390,51 @@ void hists__output_resort(struct hists *hists, struct ui_progress *prog) } } +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 d4ec4822a103..2b8a73ea12c3 100644 --- a/tools/perf/util/hist.h +++ b/tools/perf/util/hist.h @@ -381,4 +381,12 @@ int parse_filter_percentage(const struct option *opt __maybe_unused, const char *arg, int unset __maybe_unused); int perf_hist_config(const char *var, const char *value); +#define HIERARCHY_INDENT 3 + +int perf_hpp__count_sort_keys(void); + +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