From 70d544d0576775a2b3923a7e68cb49b0313d80c9 Mon Sep 17 00:00:00 2001 From: Arnaldo Carvalho de Melo Date: Mon, 3 Jan 2011 16:51:39 -0200 Subject: perf evsel: Delete the event selectors at exit Freeing all the possibly allocated resources, reducing complexity on each tool exit path. Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index e68aee3..052de17 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -965,8 +965,6 @@ int cmd_record(int argc, const char **argv, const char *prefix __used) out_free_event_array: free(event_array); out_free_fd: - list_for_each_entry(pos, &evsel_list, node) - perf_evsel__free_fd(pos); free(all_tids); all_tids = NULL; out_symbol_exit: diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 3e5f356..589ba3a 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -844,10 +844,8 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used) if (status != -1) print_stat(argc, argv); out_free_fd: - list_for_each_entry(pos, &evsel_list, node) { - perf_evsel__free_fd(pos); + list_for_each_entry(pos, &evsel_list, node) perf_evsel__free_stat_priv(pos); - } out: return status; } diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 13a836e..27b9c14 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c @@ -1495,10 +1495,8 @@ int cmd_top(int argc, const char **argv, const char *prefix __used) status = __cmd_top(); out_free_fd: - list_for_each_entry(pos, &evsel_list, node) { - perf_evsel__free_fd(pos); + list_for_each_entry(pos, &evsel_list, node) perf_evsel__free_mmap(pos); - } return status; } diff --git a/tools/perf/perf.c b/tools/perf/perf.c index 595d0f4..5b1ecd6 100644 --- a/tools/perf/perf.c +++ b/tools/perf/perf.c @@ -286,6 +286,8 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv) status = p->fn(argc, argv, prefix); exit_browser(status); + perf_evsel_list__delete(); + if (status) return status & 0xff; diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 2d948ad..3a142e9 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -982,3 +982,14 @@ int perf_evsel_list__create_default(void) ++nr_counters; return 0; } + +void perf_evsel_list__delete(void) +{ + struct perf_evsel *pos, *n; + + list_for_each_entry_safe(pos, n, &evsel_list, node) { + list_del_init(&pos->node); + perf_evsel__delete(pos); + } + nr_counters = 0; +} diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 0f915a0..0a0abc1 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -12,6 +12,7 @@ struct perf_evsel; extern struct list_head evsel_list; int perf_evsel_list__create_default(void); +void perf_evsel_list__delete(void); struct option; -- cgit v0.10.2