aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/hist.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/hist.c')
-rw-r--r--tools/perf/util/hist.c49
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)
726static struct hist_entry *hists__add_dummy_entry(struct hists *hists, 726static 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 }
757out: 765out:
@@ -761,11 +769,16 @@ out:
761static struct hist_entry *hists__find_entry(struct hists *hists, 769static 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 */
784void hists__match(struct hists *leader, struct hists *other) 797void 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 */
803int hists__link(struct hists *leader, struct hists *other) 822int 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);