|
@@ -841,3 +841,33 @@ char *callchain_list__sym_name(struct callchain_list *cl,
|
|
|
|
|
|
return bf;
|
|
|
}
|
|
|
+
|
|
|
+static void free_callchain_node(struct callchain_node *node)
|
|
|
+{
|
|
|
+ struct callchain_list *list, *tmp;
|
|
|
+ struct callchain_node *child;
|
|
|
+ struct rb_node *n;
|
|
|
+
|
|
|
+ list_for_each_entry_safe(list, tmp, &node->val, list) {
|
|
|
+ list_del(&list->list);
|
|
|
+ free(list);
|
|
|
+ }
|
|
|
+
|
|
|
+ n = rb_first(&node->rb_root_in);
|
|
|
+ while (n) {
|
|
|
+ child = container_of(n, struct callchain_node, rb_node_in);
|
|
|
+ n = rb_next(n);
|
|
|
+ rb_erase(&child->rb_node_in, &node->rb_root_in);
|
|
|
+
|
|
|
+ free_callchain_node(child);
|
|
|
+ free(child);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void free_callchain(struct callchain_root *root)
|
|
|
+{
|
|
|
+ if (!symbol_conf.use_callchain)
|
|
|
+ return;
|
|
|
+
|
|
|
+ free_callchain_node(&root->node);
|
|
|
+}
|