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>
|
2013-06-13 Siddhesh Poyarekar <siddhesh@redhat.com>
|
||||||
|
|
||||||
* NEWS: Fix note on clock function precision. Text by Roland
|
* 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. */
|
/* Give the child a chance to stop. */
|
||||||
sleep (3);
|
sleep (3);
|
||||||
|
|
||||||
CHECK_SIGCHLD ("stopped", CLD_STOPPED, SIGSTOP);
|
CHECK_SIGCHLD ("stopped (before waitid)", CLD_STOPPED, SIGSTOP);
|
||||||
|
|
||||||
/* Now try a wait that should not succeed. */
|
/* Now try a wait that should not succeed. */
|
||||||
siginfo_t info;
|
siginfo_t info;
|
||||||
|
@ -227,7 +227,7 @@ do_test (int argc, char *argv[])
|
||||||
expecting_sigchld = 0;
|
expecting_sigchld = 0;
|
||||||
}
|
}
|
||||||
else
|
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_signo = 0; /* A successful call sets it to SIGCHLD. */
|
||||||
info.si_pid = -1;
|
info.si_pid = -1;
|
||||||
|
@ -336,6 +336,13 @@ do_test (int argc, char *argv[])
|
||||||
printf ("kill (%d, SIGSTOP): %m\n", pid);
|
printf ("kill (%d, SIGSTOP): %m\n", pid);
|
||||||
RETURN (EXIT_FAILURE);
|
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);
|
pid_t wpid = waitpid (pid, &fail, WUNTRACED);
|
||||||
if (wpid < 0)
|
if (wpid < 0)
|
||||||
{
|
{
|
||||||
|
@ -354,7 +361,7 @@ do_test (int argc, char *argv[])
|
||||||
printf ("waitpid WUNTRACED on stopped: status %x\n", fail);
|
printf ("waitpid WUNTRACED on stopped: status %x\n", fail);
|
||||||
RETURN (EXIT_FAILURE);
|
RETURN (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
CHECK_SIGCHLD ("stopped", CLD_STOPPED, SIGSTOP);
|
CHECK_SIGCHLD ("stopped (after waitpid)", CLD_STOPPED, SIGSTOP);
|
||||||
|
|
||||||
expecting_sigchld = 1;
|
expecting_sigchld = 1;
|
||||||
if (kill (pid, SIGCONT) != 0)
|
if (kill (pid, SIGCONT) != 0)
|
||||||
|
@ -372,7 +379,7 @@ do_test (int argc, char *argv[])
|
||||||
expecting_sigchld = 0;
|
expecting_sigchld = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
CHECK_SIGCHLD ("continued", CLD_CONTINUED, SIGCONT);
|
CHECK_SIGCHLD ("continued (before waitpid)", CLD_CONTINUED, SIGCONT);
|
||||||
|
|
||||||
wpid = waitpid (pid, &fail, WCONTINUED);
|
wpid = waitpid (pid, &fail, WCONTINUED);
|
||||||
if (wpid < 0)
|
if (wpid < 0)
|
||||||
|
|
Loading…
Reference in New Issue