diff options
Diffstat (limited to 'tools/perf/util/callchain.c')
| -rw-r--r-- | tools/perf/util/callchain.c | 30 | 
1 files changed, 30 insertions, 0 deletions
| diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c index 64b377e591e4..14e7a123d43b 100644 --- a/tools/perf/util/callchain.c +++ b/tools/perf/util/callchain.c @@ -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); +} | 
