You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
2.0 KiB
60 lines
2.0 KiB
commit a58ad3f801960fa0dc0bb1106eb0d99f7ebd77b1 |
|
Author: Roland McGrath <roland@hack.frob.com> |
|
Date: Thu Jun 13 15:09:29 2013 -0700 |
|
|
|
Fix raciness in waitid test. |
|
|
|
diff --git a/posix/tst-waitid.c b/posix/tst-waitid.c |
|
index f8a302ea3153a853..d63ad65fbefc64ad 100644 |
|
--- a/posix/tst-waitid.c |
|
+++ b/posix/tst-waitid.c |
|
@@ -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)
|
|
|