diff options
Diffstat (limited to 'tools/perf/tests/task-exit.c')
| -rw-r--r-- | tools/perf/tests/task-exit.c | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/tools/perf/tests/task-exit.c b/tools/perf/tests/task-exit.c index d09ab579119e..5ff3db318f12 100644 --- a/tools/perf/tests/task-exit.c +++ b/tools/perf/tests/task-exit.c | |||
| @@ -9,12 +9,21 @@ | |||
| 9 | static int exited; | 9 | static int exited; |
| 10 | static int nr_exit; | 10 | static int nr_exit; |
| 11 | 11 | ||
| 12 | static void sig_handler(int sig) | 12 | static void sig_handler(int sig __maybe_unused) |
| 13 | { | 13 | { |
| 14 | exited = 1; | 14 | exited = 1; |
| 15 | } | ||
| 15 | 16 | ||
| 16 | if (sig == SIGUSR1) | 17 | /* |
| 17 | nr_exit = -1; | 18 | * perf_evlist__prepare_workload will send a SIGUSR1 if the fork fails, since |
| 19 | * we asked by setting its exec_error to this handler. | ||
| 20 | */ | ||
| 21 | static void workload_exec_failed_signal(int signo __maybe_unused, | ||
| 22 | siginfo_t *info __maybe_unused, | ||
| 23 | void *ucontext __maybe_unused) | ||
| 24 | { | ||
| 25 | exited = 1; | ||
| 26 | nr_exit = -1; | ||
| 18 | } | 27 | } |
| 19 | 28 | ||
| 20 | /* | 29 | /* |
| @@ -35,7 +44,6 @@ int test__task_exit(void) | |||
| 35 | const char *argv[] = { "true", NULL }; | 44 | const char *argv[] = { "true", NULL }; |
| 36 | 45 | ||
| 37 | signal(SIGCHLD, sig_handler); | 46 | signal(SIGCHLD, sig_handler); |
| 38 | signal(SIGUSR1, sig_handler); | ||
| 39 | 47 | ||
| 40 | evlist = perf_evlist__new_default(); | 48 | evlist = perf_evlist__new_default(); |
| 41 | if (evlist == NULL) { | 49 | if (evlist == NULL) { |
| @@ -54,13 +62,14 @@ int test__task_exit(void) | |||
| 54 | if (!evlist->cpus || !evlist->threads) { | 62 | if (!evlist->cpus || !evlist->threads) { |
| 55 | err = -ENOMEM; | 63 | err = -ENOMEM; |
| 56 | pr_debug("Not enough memory to create thread/cpu maps\n"); | 64 | pr_debug("Not enough memory to create thread/cpu maps\n"); |
| 57 | goto out_delete_maps; | 65 | goto out_delete_evlist; |
| 58 | } | 66 | } |
| 59 | 67 | ||
| 60 | err = perf_evlist__prepare_workload(evlist, &target, argv, false, true); | 68 | err = perf_evlist__prepare_workload(evlist, &target, argv, false, |
| 69 | workload_exec_failed_signal); | ||
| 61 | if (err < 0) { | 70 | if (err < 0) { |
| 62 | pr_debug("Couldn't run the workload!\n"); | 71 | pr_debug("Couldn't run the workload!\n"); |
| 63 | goto out_delete_maps; | 72 | goto out_delete_evlist; |
| 64 | } | 73 | } |
| 65 | 74 | ||
| 66 | evsel = perf_evlist__first(evlist); | 75 | evsel = perf_evlist__first(evlist); |
| @@ -74,13 +83,13 @@ int test__task_exit(void) | |||
| 74 | err = perf_evlist__open(evlist); | 83 | err = perf_evlist__open(evlist); |
| 75 | if (err < 0) { | 84 | if (err < 0) { |
| 76 | pr_debug("Couldn't open the evlist: %s\n", strerror(-err)); | 85 | pr_debug("Couldn't open the evlist: %s\n", strerror(-err)); |
| 77 | goto out_delete_maps; | 86 | goto out_delete_evlist; |
| 78 | } | 87 | } |
| 79 | 88 | ||
| 80 | if (perf_evlist__mmap(evlist, 128, true) < 0) { | 89 | if (perf_evlist__mmap(evlist, 128, true) < 0) { |
| 81 | pr_debug("failed to mmap events: %d (%s)\n", errno, | 90 | pr_debug("failed to mmap events: %d (%s)\n", errno, |
| 82 | strerror(errno)); | 91 | strerror(errno)); |
| 83 | goto out_close_evlist; | 92 | goto out_delete_evlist; |
| 84 | } | 93 | } |
| 85 | 94 | ||
| 86 | perf_evlist__start_workload(evlist); | 95 | perf_evlist__start_workload(evlist); |
| @@ -103,11 +112,7 @@ retry: | |||
| 103 | err = -1; | 112 | err = -1; |
| 104 | } | 113 | } |
| 105 | 114 | ||
| 106 | perf_evlist__munmap(evlist); | 115 | out_delete_evlist: |
| 107 | out_close_evlist: | ||
| 108 | perf_evlist__close(evlist); | ||
| 109 | out_delete_maps: | ||
| 110 | perf_evlist__delete_maps(evlist); | ||
| 111 | perf_evlist__delete(evlist); | 116 | perf_evlist__delete(evlist); |
| 112 | return err; | 117 | return err; |
| 113 | } | 118 | } |
