diff options
Diffstat (limited to 'tools/perf/tests/perf-hooks.c')
| -rw-r--r-- | tools/perf/tests/perf-hooks.c | 48 | 
1 files changed, 48 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..665ecc19671c --- /dev/null +++ b/tools/perf/tests/perf-hooks.c @@ -0,0 +1,48 @@ +#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 void the_hook(void *_hook_flags) +{ +	int *hook_flags = _hook_flags; +	int *p = NULL; + +	*hook_flags = 1234; + +	/* Generate a segfault, test perf_hooks__recover */ +	*p = 0; +} + +int test__perf_hooks(int subtest __maybe_unused) +{ +	int hook_flags = 0; + +	signal(SIGSEGV, sigsegv_handler); +	perf_hooks__set_hook("test", the_hook, &hook_flags); +	perf_hooks__invoke_test(); + +	/* hook is triggered? */ +	if (hook_flags != 1234) { +		pr_debug("Setting failed: %d (%p)\n", hook_flags, &hook_flags); +		return TEST_FAIL; +	} + +	/* the buggy hook is removed? */ +	if (perf_hooks__get_hook("test")) +		return TEST_FAIL; +	return TEST_OK; +}  |