diff options
Diffstat (limited to 'tools/perf/util/hist.c')
-rw-r--r-- | tools/perf/util/hist.c | 49 |
1 files changed, 37 insertions, 12 deletions
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index 3a9ccd09835d..8ff3c2f8a5dd 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c | |||
@@ -726,16 +726,24 @@ void hists__inc_nr_events(struct hists *hists, u32 type) | |||
726 | static struct hist_entry *hists__add_dummy_entry(struct hists *hists, | 726 | static struct hist_entry *hists__add_dummy_entry(struct hists *hists, |
727 | struct hist_entry *pair) | 727 | struct hist_entry *pair) |
728 | { | 728 | { |
729 | struct rb_node **p = &hists->entries.rb_node; | 729 | struct rb_root *root; |
730 | struct rb_node **p; | ||
730 | struct rb_node *parent = NULL; | 731 | struct rb_node *parent = NULL; |
731 | struct hist_entry *he; | 732 | struct hist_entry *he; |
732 | int cmp; | 733 | int cmp; |
733 | 734 | ||
735 | if (sort__need_collapse) | ||
736 | root = &hists->entries_collapsed; | ||
737 | else | ||
738 | root = hists->entries_in; | ||
739 | |||
740 | p = &root->rb_node; | ||
741 | |||
734 | while (*p != NULL) { | 742 | while (*p != NULL) { |
735 | parent = *p; | 743 | parent = *p; |
736 | he = rb_entry(parent, struct hist_entry, rb_node); | 744 | he = rb_entry(parent, struct hist_entry, rb_node_in); |
737 | 745 | ||
738 | cmp = hist_entry__cmp(he, pair); | 746 | cmp = hist_entry__collapse(he, pair); |
739 | 747 | ||
740 | if (!cmp) | 748 | if (!cmp) |
741 | goto out; | 749 | goto out; |
@@ -750,8 +758,8 @@ static struct hist_entry *hists__add_dummy_entry(struct hists *hists, | |||
750 | if (he) { | 758 | if (he) { |
751 | memset(&he->stat, 0, sizeof(he->stat)); | 759 | memset(&he->stat, 0, sizeof(he->stat)); |
752 | he->hists = hists; | 760 | he->hists = hists; |
753 | rb_link_node(&he->rb_node, parent, p); | 761 | rb_link_node(&he->rb_node_in, parent, p); |
754 | rb_insert_color(&he->rb_node, &hists->entries); | 762 | rb_insert_color(&he->rb_node_in, root); |
755 | hists__inc_nr_entries(hists, he); | 763 | hists__inc_nr_entries(hists, he); |
756 | } | 764 | } |
757 | out: | 765 | out: |
@@ -761,11 +769,16 @@ out: | |||
761 | static struct hist_entry *hists__find_entry(struct hists *hists, | 769 | static struct hist_entry *hists__find_entry(struct hists *hists, |
762 | struct hist_entry *he) | 770 | struct hist_entry *he) |
763 | { | 771 | { |
764 | struct rb_node *n = hists->entries.rb_node; | 772 | struct rb_node *n; |
773 | |||
774 | if (sort__need_collapse) | ||
775 | n = hists->entries_collapsed.rb_node; | ||
776 | else | ||
777 | n = hists->entries_in->rb_node; | ||
765 | 778 | ||
766 | while (n) { | 779 | while (n) { |
767 | struct hist_entry *iter = rb_entry(n, struct hist_entry, rb_node); | 780 | struct hist_entry *iter = rb_entry(n, struct hist_entry, rb_node_in); |
768 | int64_t cmp = hist_entry__cmp(iter, he); | 781 | int64_t cmp = hist_entry__collapse(iter, he); |
769 | 782 | ||
770 | if (cmp < 0) | 783 | if (cmp < 0) |
771 | n = n->rb_left; | 784 | n = n->rb_left; |
@@ -783,11 +796,17 @@ static struct hist_entry *hists__find_entry(struct hists *hists, | |||
783 | */ | 796 | */ |
784 | void hists__match(struct hists *leader, struct hists *other) | 797 | void hists__match(struct hists *leader, struct hists *other) |
785 | { | 798 | { |
799 | struct rb_root *root; | ||
786 | struct rb_node *nd; | 800 | struct rb_node *nd; |
787 | struct hist_entry *pos, *pair; | 801 | struct hist_entry *pos, *pair; |
788 | 802 | ||
789 | for (nd = rb_first(&leader->entries); nd; nd = rb_next(nd)) { | 803 | if (sort__need_collapse) |
790 | pos = rb_entry(nd, struct hist_entry, rb_node); | 804 | root = &leader->entries_collapsed; |
805 | else | ||
806 | root = leader->entries_in; | ||
807 | |||
808 | for (nd = rb_first(root); nd; nd = rb_next(nd)) { | ||
809 | pos = rb_entry(nd, struct hist_entry, rb_node_in); | ||
791 | pair = hists__find_entry(other, pos); | 810 | pair = hists__find_entry(other, pos); |
792 | 811 | ||
793 | if (pair) | 812 | if (pair) |
@@ -802,11 +821,17 @@ void hists__match(struct hists *leader, struct hists *other) | |||
802 | */ | 821 | */ |
803 | int hists__link(struct hists *leader, struct hists *other) | 822 | int hists__link(struct hists *leader, struct hists *other) |
804 | { | 823 | { |
824 | struct rb_root *root; | ||
805 | struct rb_node *nd; | 825 | struct rb_node *nd; |
806 | struct hist_entry *pos, *pair; | 826 | struct hist_entry *pos, *pair; |
807 | 827 | ||
808 | for (nd = rb_first(&other->entries); nd; nd = rb_next(nd)) { | 828 | if (sort__need_collapse) |
809 | pos = rb_entry(nd, struct hist_entry, rb_node); | 829 | root = &other->entries_collapsed; |
830 | else | ||
831 | root = other->entries_in; | ||
832 | |||
833 | for (nd = rb_first(root); nd; nd = rb_next(nd)) { | ||
834 | pos = rb_entry(nd, struct hist_entry, rb_node_in); | ||
810 | 835 | ||
811 | if (!hist_entry__has_pairs(pos)) { | 836 | if (!hist_entry__has_pairs(pos)) { |
812 | pair = hists__add_dummy_entry(leader, pos); | 837 | pair = hists__add_dummy_entry(leader, pos); |