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>
This commit is contained in:
Родитель
355afe8163
Коммит
78da39faf7
|
@ -753,6 +753,12 @@ ifndef NO_STRLCPY
|
|||
endif
|
||||
endif
|
||||
|
||||
ifndef NO_ON_EXIT
|
||||
ifeq ($(call try-cc,$(SOURCE_ON_EXIT),),y)
|
||||
BASIC_CFLAGS += -DHAVE_ON_EXIT
|
||||
endif
|
||||
endif
|
||||
|
||||
ifndef NO_BACKTRACE
|
||||
ifeq ($(call try-cc,$(SOURCE_BACKTRACE),),y)
|
||||
BASIC_CFLAGS += -DBACKTRACE_SUPPORT
|
||||
|
|
|
@ -31,6 +31,38 @@
|
|||
#include <sched.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#ifndef HAVE_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(void);
|
||||
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(void)
|
||||
{
|
||||
int i;
|
||||
for (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
|
||||
|
|
|
@ -203,4 +203,13 @@ int main(void)
|
|||
return audit_open();
|
||||
}
|
||||
endef
|
||||
endif
|
||||
endif
|
||||
|
||||
define SOURCE_ON_EXIT
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
return on_exit(NULL, NULL);
|
||||
}
|
||||
endef
|
||||
|
|
Загрузка…
Ссылка в новой задаче