diff options
Diffstat (limited to 'lib/igt_core.c')
-rw-r--r-- | lib/igt_core.c | 45 |
1 files changed, 17 insertions, 28 deletions
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 @@ -843,56 +843,45 @@ bool __igt_fork_helper(struct igt_helper_process *proc) } /** - * igt_stop_helper: + * igt_wait_helper: * @proc: #igt_helper_process structure * - * Terminates a helper process. It is an error to call this on a helper process - * which hasn't been spawned yet. + * Joins a helper process. It is an error to call this on a helper process which + * hasn't been spawned yet. */ -void igt_stop_helper(struct igt_helper_process *proc) +int igt_wait_helper(struct igt_helper_process *proc) { - int status, ret; + int status = -1; 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)); + waitpid(proc->pid, &status, WNOHANG); proc->running = false; helper_process_pids[proc->id] = -1; helper_process_count--; + + return status; } /** - * igt_wait_helper: + * igt_stop_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. + * Terminates 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) +void igt_stop_helper(struct igt_helper_process *proc) { int status; - assert(proc->running); - - while (waitpid(proc->pid, &status, 0) == -1 && - errno == EINTR) - ; - igt_assert(WIFEXITED(status) && WEXITSTATUS(status) == 0); - - proc->running = false; + /* failure here means the pid is already dead and so waiting is safe */ + kill(proc->pid, proc->use_SIGKILL ? SIGKILL : SIGTERM); - 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) |