|
@@ -726,16 +726,24 @@ void hists__inc_nr_events(struct hists *hists, u32 type)
|
|
|
static struct hist_entry *hists__add_dummy_entry(struct hists *hists,
|
|
|
struct hist_entry *pair)
|
|
|
{
|
|
|
- struct rb_node **p = &hists->entries.rb_node;
|
|
|
+ struct rb_root *root;
|
|
|
+ struct rb_node **p;
|
|
|
struct rb_node *parent = NULL;
|
|
|
struct hist_entry *he;
|
|
|
int cmp;
|
|
|
|
|
|
+ if (sort__need_collapse)
|
|
|
+ root = &hists->entries_collapsed;
|
|
|
+ else
|
|
|
+ root = hists->entries_in;
|
|
|
+
|
|
|
+ p = &root->rb_node;
|
|
|
+
|
|
|
while (*p != NULL) {
|
|
|
parent = *p;
|
|
|
- he = rb_entry(parent, struct hist_entry, rb_node);
|
|
|
+ he = rb_entry(parent, struct hist_entry, rb_node_in);
|
|
|
|
|
|
- cmp = hist_entry__cmp(he, pair);
|
|
|
+ cmp = hist_entry__collapse(he, pair);
|
|
|
|
|
|
if (!cmp)
|
|
|
goto out;
|
|
@@ -750,8 +758,8 @@ static struct hist_entry *hists__add_dummy_entry(struct hists *hists,
|
|
|
if (he) {
|
|
|
memset(&he->stat, 0, sizeof(he->stat));
|
|
|
he->hists = hists;
|
|
|
- rb_link_node(&he->rb_node, parent, p);
|
|
|
- rb_insert_color(&he->rb_node, &hists->entries);
|
|
|
+ rb_link_node(&he->rb_node_in, parent, p);
|
|
|
+ rb_insert_color(&he->rb_node_in, root);
|
|
|
hists__inc_nr_entries(hists, he);
|
|
|
}
|
|
|
out:
|
|
@@ -761,11 +769,16 @@ out:
|
|
|
static struct hist_entry *hists__find_entry(struct hists *hists,
|
|
|
struct hist_entry *he)
|
|
|
{
|
|
|
- struct rb_node *n = hists->entries.rb_node;
|
|
|
+ struct rb_node *n;
|
|
|
+
|
|
|
+ if (sort__need_collapse)
|
|
|
+ n = hists->entries_collapsed.rb_node;
|
|
|
+ else
|
|
|
+ n = hists->entries_in->rb_node;
|
|
|
|
|
|
while (n) {
|
|
|
- struct hist_entry *iter = rb_entry(n, struct hist_entry, rb_node);
|
|
|
- int64_t cmp = hist_entry__cmp(iter, he);
|
|
|
+ struct hist_entry *iter = rb_entry(n, struct hist_entry, rb_node_in);
|
|
|
+ int64_t cmp = hist_entry__collapse(iter, he);
|
|
|
|
|
|
if (cmp < 0)
|
|
|
n = n->rb_left;
|
|
@@ -783,11 +796,17 @@ static struct hist_entry *hists__find_entry(struct hists *hists,
|
|
|
*/
|
|
|
void hists__match(struct hists *leader, struct hists *other)
|
|
|
{
|
|
|
+ struct rb_root *root;
|
|
|
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);
|
|
|
+ if (sort__need_collapse)
|
|
|
+ root = &leader->entries_collapsed;
|
|
|
+ else
|
|
|
+ root = leader->entries_in;
|
|
|
+
|
|
|
+ for (nd = rb_first(root); nd; nd = rb_next(nd)) {
|
|
|
+ pos = rb_entry(nd, struct hist_entry, rb_node_in);
|
|
|
pair = hists__find_entry(other, pos);
|
|
|
|
|
|
if (pair)
|
|
@@ -802,11 +821,17 @@ void hists__match(struct hists *leader, struct hists *other)
|
|
|
*/
|
|
|
int hists__link(struct hists *leader, struct hists *other)
|
|
|
{
|
|
|
+ struct rb_root *root;
|
|
|
struct rb_node *nd;
|
|
|
struct hist_entry *pos, *pair;
|
|
|
|
|
|
- for (nd = rb_first(&other->entries); nd; nd = rb_next(nd)) {
|
|
|
- pos = rb_entry(nd, struct hist_entry, rb_node);
|
|
|
+ if (sort__need_collapse)
|
|
|
+ root = &other->entries_collapsed;
|
|
|
+ else
|
|
|
+ root = other->entries_in;
|
|
|
+
|
|
|
+ for (nd = rb_first(root); nd; nd = rb_next(nd)) {
|
|
|
+ pos = rb_entry(nd, struct hist_entry, rb_node_in);
|
|
|
|
|
|
if (!hist_entry__has_pairs(pos)) {
|
|
|
pair = hists__add_dummy_entry(leader, pos);
|