perf evsel: Fix order of event list deletion
authorArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 11 Jan 2011 14:42:00 +0000 (12:42 -0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 11 Jan 2011 14:51:03 +0000 (12:51 -0200)
We need to defer calling perf_evsel_list__delete() till after atexit
registered routines, because we need to traverse the events being
recorded at that time at least on 'perf record'.

This fixes the problem reported by Thomas Renninger where cmd_record
called by cmd_timechart would not write the tracing data to the perf.data
file header because the evsel_list at atexit (control+C on 'perf timechart
record') time would be empty, being already deleted by run_builtin(),
and thus 'perf timechart' when trying to process such perf.data file would
die with:

"no trace data in the file"

Problem introduced in 70d544d.

Reported-by: Thomas Renninger <trenn@suse.de>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Renninger <trenn@suse.de>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-record.c
tools/perf/builtin-stat.c
tools/perf/builtin-top.c
tools/perf/perf.c

index 7069bd3e90b308871d4f309b99335cba09b9fbbc..aa7ece3976561e63ef5c03622b6c73466996191b 100644 (file)
@@ -480,6 +480,7 @@ static void atexit_header(void)
                        process_buildids();
                perf_header__write(&session->header, output, true);
                perf_session__delete(session);
+               perf_evsel_list__delete();
                symbol__exit();
        }
 }
index c385a63ebfd177461c83d910cbe9f62e89600432..0ff11d9b13be9cb5bfc9f86259dbd972be148d2e 100644 (file)
@@ -743,6 +743,7 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used)
 out_free_fd:
        list_for_each_entry(pos, &evsel_list, node)
                perf_evsel__free_stat_priv(pos);
+       perf_evsel_list__delete();
 out:
        thread_map__delete(threads);
        threads = NULL;
index 6ce4042421bd92b1574f50409cf60f506675ddfd..4b995ee099cf7a4efc5a388e7dcd1d7f203b9eab 100644 (file)
@@ -1490,6 +1490,7 @@ int cmd_top(int argc, const char **argv, const char *prefix __used)
 out_free_fd:
        list_for_each_entry(pos, &evsel_list, node)
                perf_evsel__free_mmap(pos);
+       perf_evsel_list__delete();
 
        return status;
 }
index 5b1ecd66bb36a053b6427020f9aa3361d4ec1265..595d0f4a7103eb45ccac7b5ad47fd3ebfee8ab0d 100644 (file)
@@ -286,8 +286,6 @@ 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;