diff options
Diffstat (limited to 'tools/perf/tests/perf-hooks.c')
| -rw-r--r-- | tools/perf/tests/perf-hooks.c | 44 | 
1 files changed, 44 insertions, 0 deletions
diff --git a/tools/perf/tests/perf-hooks.c b/tools/perf/tests/perf-hooks.c new file mode 100644 index 000000000000..9338cb2c25ab --- /dev/null +++ b/tools/perf/tests/perf-hooks.c @@ -0,0 +1,44 @@ +#include <signal.h> +#include <stdlib.h> + +#include "tests.h" +#include "debug.h" +#include "util.h" +#include "perf-hooks.h" + +static void sigsegv_handler(int sig __maybe_unused) +{ +	pr_debug("SIGSEGV is observed as expected, try to recover.\n"); +	perf_hooks__recover(); +	signal(SIGSEGV, SIG_DFL); +	raise(SIGSEGV); +	exit(-1); +} + +static int hook_flags; + +static void the_hook(void) +{ +	int *p = NULL; + +	hook_flags = 1234; + +	/* Generate a segfault, test perf_hooks__recover */ +	*p = 0; +} + +int test__perf_hooks(int subtest __maybe_unused) +{ +	signal(SIGSEGV, sigsegv_handler); +	perf_hooks__set_hook("test", the_hook); +	perf_hooks__invoke_test(); + +	/* hook is triggered? */ +	if (hook_flags != 1234) +		return TEST_FAIL; + +	/* the buggy hook is removed? */ +	if (perf_hooks__get_hook("test")) +		return TEST_FAIL; +	return TEST_OK; +}  | 
