Skip to content

Commit

Permalink
perf diff: Move hists__match to the hists lib
Browse files Browse the repository at this point in the history
Its not 'diff' specific and will be useful for other use cases, like
bucketizing multiple events in a single session.

Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-o35urjgxfxxm70aw1wa81s4w@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Arnaldo Carvalho de Melo committed Nov 8, 2012
1 parent b821c73 commit 95529be
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 34 deletions.
35 changes: 1 addition & 34 deletions tools/perf/builtin-diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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);
Expand Down
37 changes: 37 additions & 0 deletions tools/perf/util/hist.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
2 changes: 2 additions & 0 deletions tools/perf/util/hist.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 95529be

Please sign in to comment.