diff options
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/perf/builtin-diff.c | 35 | ||||
| -rw-r--r-- | tools/perf/util/hist.c | 37 | ||||
| -rw-r--r-- | tools/perf/util/hist.h | 2 | 
3 files changed, 40 insertions, 34 deletions
diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c index 8a9db38e562..e99fb3bc1c2 100644 --- a/tools/perf/builtin-diff.c +++ b/tools/perf/builtin-diff.c @@ -334,39 +334,6 @@ static void hists__name_resort(struct hists *self, bool sort)  		self->entries = tmp;  } -static struct hist_entry *hists__find_entry(struct hists *self, -					    struct hist_entry *he) -{ -	struct rb_node *n = self->entries.rb_node; - -	while (n) { -		struct hist_entry *iter = rb_entry(n, struct hist_entry, rb_node); -		int64_t cmp = hist_entry__cmp(he, iter); - -		if (cmp < 0) -			n = n->rb_left; -		else if (cmp > 0) -			n = n->rb_right; -		else -			return iter; -	} - -	return NULL; -} - -static void hists__match(struct hists *older, struct hists *newer) -{ -	struct rb_node *nd; - -	for (nd = rb_first(&newer->entries); nd; nd = rb_next(nd)) { -		struct hist_entry *pos = rb_entry(nd, struct hist_entry, rb_node), -				  *pair = hists__find_entry(older, pos); - -		if (pair) -			hist__entry_add_pair(pos, pair); -	} -} -  static struct perf_evsel *evsel_match(struct perf_evsel *evsel,  				      struct perf_evlist *evlist)  { @@ -520,7 +487,7 @@ static void hists__compute_resort(struct hists *hists)  static void hists__process(struct hists *old, struct hists *new)  { -	hists__match(old, new); +	hists__match(new, old);  	if (show_baseline_only)  		hists__baseline_only(new); diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index f42de79d2e6..c1de3b05fe0 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c @@ -716,3 +716,40 @@ void hists__inc_nr_events(struct hists *hists, u32 type)  	++hists->stats.nr_events[0];  	++hists->stats.nr_events[type];  } + +static struct hist_entry *hists__find_entry(struct hists *hists, +					    struct hist_entry *he) +{ +	struct rb_node *n = hists->entries.rb_node; + +	while (n) { +		struct hist_entry *iter = rb_entry(n, struct hist_entry, rb_node); +		int64_t cmp = hist_entry__cmp(he, iter); + +		if (cmp < 0) +			n = n->rb_left; +		else if (cmp > 0) +			n = n->rb_right; +		else +			return iter; +	} + +	return NULL; +} + +/* + * Look for pairs to link to the leader buckets (hist_entries): + */ +void hists__match(struct hists *leader, struct hists *other) +{ +	struct rb_node *nd; +	struct hist_entry *pos, *pair; + +	for (nd = rb_first(&leader->entries); nd; nd = rb_next(nd)) { +		pos  = rb_entry(nd, struct hist_entry, rb_node); +		pair = hists__find_entry(other, pos); + +		if (pair) +			hist__entry_add_pair(pos, pair); +	} +} diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h index a4f45dd0469..ff1c3963e04 100644 --- a/tools/perf/util/hist.h +++ b/tools/perf/util/hist.h @@ -115,6 +115,8 @@ bool hists__new_col_len(struct hists *self, enum hist_column col, u16 len);  void hists__reset_col_len(struct hists *hists);  void hists__calc_col_len(struct hists *hists, struct hist_entry *he); +void hists__match(struct hists *leader, struct hists *other); +  struct perf_hpp {  	char *buf;  	size_t size;  |