4 struct rb_root collapse_hists
;
5 struct rb_root output_hists
;
8 struct callchain_param callchain_param
= {
9 .mode
= CHAIN_GRAPH_REL
,
14 unsigned long total_mmap
;
15 unsigned long total_comm
;
16 unsigned long total_fork
;
17 unsigned long total_unknown
;
18 unsigned long total_lost
;
21 * histogram, sorted on item, collects counts
25 hist_entry__cmp(struct hist_entry
*left
, struct hist_entry
*right
)
27 struct sort_entry
*se
;
30 list_for_each_entry(se
, &hist_entry__sort_list
, list
) {
31 cmp
= se
->cmp(left
, right
);
40 hist_entry__collapse(struct hist_entry
*left
, struct hist_entry
*right
)
42 struct sort_entry
*se
;
45 list_for_each_entry(se
, &hist_entry__sort_list
, list
) {
46 int64_t (*f
)(struct hist_entry
*, struct hist_entry
*);
48 f
= se
->collapse
?: se
->cmp
;
58 void hist_entry__free(struct hist_entry
*he
)
64 * collapse the histogram
67 void collapse__insert_entry(struct hist_entry
*he
)
69 struct rb_node
**p
= &collapse_hists
.rb_node
;
70 struct rb_node
*parent
= NULL
;
71 struct hist_entry
*iter
;
76 iter
= rb_entry(parent
, struct hist_entry
, rb_node
);
78 cmp
= hist_entry__collapse(iter
, he
);
81 iter
->count
+= he
->count
;
92 rb_link_node(&he
->rb_node
, parent
, p
);
93 rb_insert_color(&he
->rb_node
, &collapse_hists
);
96 void collapse__resort(void)
101 if (!sort__need_collapse
)
104 next
= rb_first(&hist
);
106 n
= rb_entry(next
, struct hist_entry
, rb_node
);
107 next
= rb_next(&n
->rb_node
);
109 rb_erase(&n
->rb_node
, &hist
);
110 collapse__insert_entry(n
);
115 * reverse the map, sort on count.
118 void output__insert_entry(struct hist_entry
*he
, u64 min_callchain_hits
)
120 struct rb_node
**p
= &output_hists
.rb_node
;
121 struct rb_node
*parent
= NULL
;
122 struct hist_entry
*iter
;
125 callchain_param
.sort(&he
->sorted_chain
, &he
->callchain
,
126 min_callchain_hits
, &callchain_param
);
130 iter
= rb_entry(parent
, struct hist_entry
, rb_node
);
132 if (he
->count
> iter
->count
)
138 rb_link_node(&he
->rb_node
, parent
, p
);
139 rb_insert_color(&he
->rb_node
, &output_hists
);
142 void output__resort(u64 total_samples
)
144 struct rb_node
*next
;
145 struct hist_entry
*n
;
146 struct rb_root
*tree
= &hist
;
147 u64 min_callchain_hits
;
150 total_samples
* (callchain_param
.min_percent
/ 100);
152 if (sort__need_collapse
)
153 tree
= &collapse_hists
;
155 next
= rb_first(tree
);
158 n
= rb_entry(next
, struct hist_entry
, rb_node
);
159 next
= rb_next(&n
->rb_node
);
161 rb_erase(&n
->rb_node
, tree
);
162 output__insert_entry(n
, min_callchain_hits
);