mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 20:40:05 +00:00
Fix raciness in waitid test.
This commit is contained in:
parent
5865a56bf4
commit
a58ad3f801
@ -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
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user