diff --git a/lib/igt_core.c b/lib/igt_core.c index 0a2ddad9..1287ff65 100644 --- a/lib/igt_core.c +++ b/lib/igt_core.c @@ -842,6 +842,29 @@ bool __igt_fork_helper(struct igt_helper_process *proc) } +/** + * igt_wait_helper: + * @proc: #igt_helper_process structure + * + * Joins a helper process. It is an error to call this on a helper process which + * hasn't been spawned yet. + */ +int igt_wait_helper(struct igt_helper_process *proc) +{ + int status = -1; + + assert(proc->running); + + waitpid(proc->pid, &status, WNOHANG); + + proc->running = false; + + helper_process_pids[proc->id] = -1; + helper_process_count--; + + return status; +} + /** * igt_stop_helper: * @proc: #igt_helper_process structure @@ -850,49 +873,15 @@ bool __igt_fork_helper(struct igt_helper_process *proc) * which hasn't been spawned yet. */ void igt_stop_helper(struct igt_helper_process *proc) -{ - int status, ret; - - assert(proc->running); - - ret = kill(proc->pid, - proc->use_SIGKILL ? SIGKILL : SIGTERM); - assert(ret == 0); - - while (waitpid(proc->pid, &status, 0) == -1 && - errno == EINTR) - ; - igt_assert(WIFSIGNALED(status) && - WTERMSIG(status) == (proc->use_SIGKILL ? SIGKILL : SIGTERM)); - - proc->running = false; - - helper_process_pids[proc->id] = -1; - helper_process_count--; -} - -/** - * igt_wait_helper: - * @proc: #igt_helper_process structure - * - * Joins a helper process. It is an error to call this on a helper process which - * hasn't been spawned yet. - */ -void igt_wait_helper(struct igt_helper_process *proc) { int status; - assert(proc->running); + /* failure here means the pid is already dead and so waiting is safe */ + kill(proc->pid, proc->use_SIGKILL ? SIGKILL : SIGTERM); - while (waitpid(proc->pid, &status, 0) == -1 && - errno == EINTR) - ; - igt_assert(WIFEXITED(status) && WEXITSTATUS(status) == 0); - - proc->running = false; - - helper_process_pids[proc->id] = -1; - helper_process_count--; + status = igt_wait_helper(proc); + assert(WIFSIGNALED(status) && + WTERMSIG(status) == (proc->use_SIGKILL ? SIGKILL : SIGTERM)); } static void children_exit_handler(int sig) diff --git a/lib/igt_core.h b/lib/igt_core.h index 0e84e980..2838cb18 100644 --- a/lib/igt_core.h +++ b/lib/igt_core.h @@ -420,7 +420,7 @@ bool __igt_fork_helper(struct igt_helper_process *proc); */ #define igt_fork_helper(proc) \ for (; __igt_fork_helper(proc); exit(0)) -void igt_wait_helper(struct igt_helper_process *proc); +int igt_wait_helper(struct igt_helper_process *proc); void igt_stop_helper(struct igt_helper_process *proc); /* exit handler code */ diff --git a/tests/pm_rps.c b/tests/pm_rps.c index 96fec991..8593e364 100644 --- a/tests/pm_rps.c +++ b/tests/pm_rps.c @@ -253,8 +253,12 @@ static void load_helper_run(enum load load) static void load_helper_stop(void) { + int status; + kill(lh.igt_proc.pid, SIGUSR1); - igt_wait_helper(&lh.igt_proc); + status = igt_wait_helper(&lh.igt_proc); + + igt_assert(WIFSIGNALED(status) && WTERMSIG(status) == SIGUSR1); } static void load_helper_init(void)