}
/**
- * 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)
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)