Em Fri, Dec 01, 2017 at 06:57:27PM +0800, Jin Yao escreveu: > Previously the rbtree was used to link generic metrics.
Try to make the one line subject more descriptive, I'm changing it to: perf stat: Extend rbtree to support per-thread shadow stats - Arnaldo > This patches adds new ctx/type/stat into rbtree keys because we > will use this rbtree to maintain shadow metrics to replace original > a couple of static arrays for supporting per-thread shadow stats. > > Signed-off-by: Jin Yao <yao....@linux.intel.com> > --- > tools/perf/util/stat-shadow.c | 27 +++++++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > > diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c > index 5853901..c53b80d 100644 > --- a/tools/perf/util/stat-shadow.c > +++ b/tools/perf/util/stat-shadow.c > @@ -45,7 +45,10 @@ struct stats walltime_nsecs_stats; > struct saved_value { > struct rb_node rb_node; > struct perf_evsel *evsel; > + enum stat_type type; > + int ctx; > int cpu; > + struct runtime_stat *stat; > struct stats stats; > }; > > @@ -58,6 +61,30 @@ static int saved_value_cmp(struct rb_node *rb_node, const > void *entry) > > if (a->cpu != b->cpu) > return a->cpu - b->cpu; > + > + /* > + * Previously the rbtree was used to link generic metrics. > + * The keys were evsel/cpu. Now the rbtree is extended to support > + * per-thread shadow stats. For shadow stats case, the keys > + * are cpu/type/ctx/stat (evsel is NULL). For generic metrics > + * case, the keys are still evsel/cpu (type/ctx/stat are 0 or NULL). > + */ > + if (a->type != b->type) > + return a->type - b->type; > + > + if (a->ctx != b->ctx) > + return a->ctx - b->ctx; > + > + if (a->evsel == NULL && b->evsel == NULL) { > + if (a->stat == b->stat) > + return 0; > + > + if ((char *)a->stat < (char *)b->stat) > + return -1; > + > + return 1; > + } > + > if (a->evsel == b->evsel) > return 0; > if ((char *)a->evsel < (char *)b->evsel) > -- > 2.7.4