summaryrefslogtreecommitdiff
path: root/tools/perf/builtin-record.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/builtin-record.c')
-rw-r--r--tools/perf/builtin-record.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index e9231659754..451db235c1c 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -27,10 +27,43 @@
#include "util/cpumap.h"
#include "util/thread_map.h"
+#include <stdlib.h>
#include <unistd.h>
#include <sched.h>
#include <sys/mman.h>
+#ifdef ANDROID
+/* While stdlib.h has a prototype for it,
+ Bionic doesn't actually implement on_exit() */
+#ifndef ATEXIT_MAX
+#define ATEXIT_MAX 32
+#endif
+static int __on_exit_count = 0;
+typedef void (*on_exit_func_t)(int, void*);
+static on_exit_func_t __on_exit_funcs[ATEXIT_MAX];
+static void *__on_exit_args[ATEXIT_MAX];
+static int __exitcode = 0;
+static void __handle_on_exit_funcs();
+static int on_exit(on_exit_func_t function, void *arg);
+#define exit(x) (exit)(__exitcode = (x))
+
+static int on_exit(on_exit_func_t function, void *arg) {
+ if(__on_exit_count == ATEXIT_MAX)
+ return ENOMEM;
+ else if(__on_exit_count == 0)
+ atexit(__handle_on_exit_funcs);
+ __on_exit_funcs[__on_exit_count] = function;
+ __on_exit_args[__on_exit_count++] = arg;
+ return 0;
+}
+
+static void __handle_on_exit_funcs() {
+ for(int i=0; i<__on_exit_count; i++) {
+ __on_exit_funcs[i](__exitcode, __on_exit_args[i]);
+ }
+}
+#endif
+
enum write_mode_t {
WRITE_FORCE,
WRITE_APPEND