aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorBernhard Rosenkraenzer <Bernhard.Rosenkranzer@linaro.org>2012-10-08 02:43:26 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2012-10-08 16:38:25 -0400
commit78da39faf7c903bb6e3c20a726fde1bf98d10af8 (patch)
treec3aa294624d66d52ce6952568ac95880c202a16a /tools
parent355afe816312faf20d81fdcade29e0361d72a7b4 (diff)
perf tools: Add on_exit implementation
on_exit() is only available in new versions of glibc. It is not implemented in Bionic and will lead to linking errors when compiling for Android. Implement a wrapper for on_exit using atexit. The implementation for on_exit is the one sent by Bernhard Rosenkraenzer in https://lkml.org/lkml/2012/8/23/316. The configuration part from the Makefile is different than the one from the original patch. Signed-off-by: Bernhard Rosenkraenzer <Bernhard.Rosenkranzer@linaro.org> Signed-off-by: Irina Tirdea <irina.tirdea@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Irina Tirdea <irina.tirdea@intel.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Pekka Enberg <penberg@kernel.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Steven Rostedt <rostedt@goodmis.org> Link: http://lkml.kernel.org/r/1349678613-7045-2-git-send-email-irina.tirdea@gmail.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/perf/Makefile6
-rw-r--r--tools/perf/builtin-record.c32
-rw-r--r--tools/perf/config/feature-tests.mak11
3 files changed, 48 insertions, 1 deletions
diff --git a/tools/perf/Makefile b/tools/perf/Makefile
index d80a33324785..a7d8745e0ab2 100644
--- a/tools/perf/Makefile
+++ b/tools/perf/Makefile
@@ -753,6 +753,12 @@ ifndef NO_STRLCPY
753 endif 753 endif
754endif 754endif
755 755
756ifndef NO_ON_EXIT
757 ifeq ($(call try-cc,$(SOURCE_ON_EXIT),),y)
758 BASIC_CFLAGS += -DHAVE_ON_EXIT
759 endif
760endif
761
756ifndef NO_BACKTRACE 762ifndef NO_BACKTRACE
757 ifeq ($(call try-cc,$(SOURCE_BACKTRACE),),y) 763 ifeq ($(call try-cc,$(SOURCE_BACKTRACE),),y)
758 BASIC_CFLAGS += -DBACKTRACE_SUPPORT 764 BASIC_CFLAGS += -DBACKTRACE_SUPPORT
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index e9231659754d..73b5d7f91194 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -31,6 +31,38 @@
31#include <sched.h> 31#include <sched.h>
32#include <sys/mman.h> 32#include <sys/mman.h>
33 33
34#ifndef HAVE_ON_EXIT
35#ifndef ATEXIT_MAX
36#define ATEXIT_MAX 32
37#endif
38static int __on_exit_count = 0;
39typedef void (*on_exit_func_t) (int, void *);
40static on_exit_func_t __on_exit_funcs[ATEXIT_MAX];
41static void *__on_exit_args[ATEXIT_MAX];
42static int __exitcode = 0;
43static void __handle_on_exit_funcs(void);
44static int on_exit(on_exit_func_t function, void *arg);
45#define exit(x) (exit)(__exitcode = (x))
46
47static int on_exit(on_exit_func_t function, void *arg)
48{
49 if (__on_exit_count == ATEXIT_MAX)
50 return -ENOMEM;
51 else if (__on_exit_count == 0)
52 atexit(__handle_on_exit_funcs);
53 __on_exit_funcs[__on_exit_count] = function;
54 __on_exit_args[__on_exit_count++] = arg;
55 return 0;
56}
57
58static void __handle_on_exit_funcs(void)
59{
60 int i;
61 for (i = 0; i < __on_exit_count; i++)
62 __on_exit_funcs[i] (__exitcode, __on_exit_args[i]);
63}
64#endif
65
34enum write_mode_t { 66enum write_mode_t {
35 WRITE_FORCE, 67 WRITE_FORCE,
36 WRITE_APPEND 68 WRITE_APPEND
diff --git a/tools/perf/config/feature-tests.mak b/tools/perf/config/feature-tests.mak
index 4add41bb0c7e..eaeb0fd6f395 100644
--- a/tools/perf/config/feature-tests.mak
+++ b/tools/perf/config/feature-tests.mak
@@ -203,4 +203,13 @@ int main(void)
203 return audit_open(); 203 return audit_open();
204} 204}
205endef 205endef
206endif \ No newline at end of file 206endif
207
208define SOURCE_ON_EXIT
209#include <stdio.h>
210
211int main(void)
212{
213 return on_exit(NULL, NULL);
214}
215endef