summaryrefslogtreecommitdiff
path: root/lib/drmtest.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/drmtest.c')
-rw-r--r--lib/drmtest.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/lib/drmtest.c b/lib/drmtest.c
index 1ba8cad4..a3ff0d6f 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -981,6 +981,7 @@ static void fork_helper_exit_handler(int sig)
bool __igt_fork_helper(struct igt_helper_process *proc)
{
pid_t pid;
+ sighandler_t oldsig;
int id;
assert(!proc->running);
@@ -991,6 +992,13 @@ bool __igt_fork_helper(struct igt_helper_process *proc)
igt_install_exit_handler(fork_helper_exit_handler);
+ /*
+ * XXX: There's a race between fork and the subsequent kill in
+ * igt_stop_signal_helper if we don't ovewrite the SIGQUIT handler. Note
+ * that inserting sufficient amounts of printf or other delays makes
+ * this unnecessary.
+ */
+ oldsig = signal(SIGQUIT, SIG_DFL);
switch (pid = fork()) {
case -1:
igt_assert(0);
@@ -1000,6 +1008,8 @@ bool __igt_fork_helper(struct igt_helper_process *proc)
return true;
default:
+ signal(SIGQUIT, oldsig);
+
proc->running = true;
proc->pid = pid;
proc->id = id;
@@ -1023,7 +1033,9 @@ void igt_stop_helper(struct igt_helper_process *proc)
assert(proc->running);
assert(kill(proc->pid, SIGQUIT) == 0);
- waitpid(proc->pid, &status, 0);
+ while (waitpid(proc->pid, &status, 0) == -1 &&
+ errno == -EINTR)
+ ;
proc->running = false;