summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/igt_core.c45
-rw-r--r--lib/igt_core.h2
-rw-r--r--tests/pm_rps.c6
3 files changed, 23 insertions, 30 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)
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)