Fix raciness in waitid test.

This commit is contained in:
Roland McGrath 2013-06-13 15:09:29 -07:00
parent 5865a56bf4
commit a58ad3f801
2 changed files with 18 additions and 4 deletions

View File

@ -1,3 +1,10 @@
2013-06-13 Roland McGrath <roland@hack.frob.com>
* posix/tst-waitid.c (do_test): Distinguish different instances of
stopped/continued in CHECK_SIGCHLD uses. Insert a delay between
sending SIGSTOP and calling waitpid to ensure SIGCHLD gets delivered
before entering the kernel for waitpid.
2013-06-13 Siddhesh Poyarekar <siddhesh@redhat.com>
* NEWS: Fix note on clock function precision. Text by Roland

View File

@ -145,7 +145,7 @@ do_test (int argc, char *argv[])
/* Give the child a chance to stop. */
sleep (3);
CHECK_SIGCHLD ("stopped", CLD_STOPPED, SIGSTOP);
CHECK_SIGCHLD ("stopped (before waitid)", CLD_STOPPED, SIGSTOP);
/* Now try a wait that should not succeed. */
siginfo_t info;
@ -227,7 +227,7 @@ do_test (int argc, char *argv[])
expecting_sigchld = 0;
}
else
CHECK_SIGCHLD ("continued", CLD_CONTINUED, SIGCONT);
CHECK_SIGCHLD ("continued (before waitid)", CLD_CONTINUED, SIGCONT);
info.si_signo = 0; /* A successful call sets it to SIGCHLD. */
info.si_pid = -1;
@ -336,6 +336,13 @@ do_test (int argc, char *argv[])
printf ("kill (%d, SIGSTOP): %m\n", pid);
RETURN (EXIT_FAILURE);
}
/* Give the child a chance to stop. The waitpid call below will block
until it has stopped, but if we are real quick and enter the waitpid
system call before the SIGCHLD has been generated, then it will be
discarded and never delivered. */
sleep (3);
pid_t wpid = waitpid (pid, &fail, WUNTRACED);
if (wpid < 0)
{
@ -354,7 +361,7 @@ do_test (int argc, char *argv[])
printf ("waitpid WUNTRACED on stopped: status %x\n", fail);
RETURN (EXIT_FAILURE);
}
CHECK_SIGCHLD ("stopped", CLD_STOPPED, SIGSTOP);
CHECK_SIGCHLD ("stopped (after waitpid)", CLD_STOPPED, SIGSTOP);
expecting_sigchld = 1;
if (kill (pid, SIGCONT) != 0)
@ -372,7 +379,7 @@ do_test (int argc, char *argv[])
expecting_sigchld = 0;
}
else
CHECK_SIGCHLD ("continued", CLD_CONTINUED, SIGCONT);
CHECK_SIGCHLD ("continued (before waitpid)", CLD_CONTINUED, SIGCONT);
wpid = waitpid (pid, &fail, WCONTINUED);
if (wpid < 0)