summaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorFilipe Brandenburger <filbranden@google.com>2014-12-25 11:40:46 -0500
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2014-12-25 11:55:12 -0500
commit0289a5bcb5eec84783f771e634ccafe5a2e4936c (patch)
tree0a9202591aadb6c1c7c5b55bb97cc59bbbfbc22b /src/test
parente50221bf1ae8bc8e14f242efa4c9d26b7a47639b (diff)
test: wait for cloned thread to exit
In test_raw_clone, make sure the cloned thread calls _exit() and in the parent thread call waitpid(..., __WCLONE) to wait for the child thread to terminate, otherwise there is a race condition where the child thread will log to the console after the test process has already exited and the assertion from the child thread might not be enforced. The absence of this patch might also create problems for other tests that would be added after this one, since potentially both parent and child would run those tests as the child would continue running. Tested by confirming that the logs from the child are printed before the test terminates and that a false assertion in the child aborts the test with a core dump. [zj: also add check for the return value.]
Diffstat (limited to 'src/test')
-rw-r--r--src/test/test-util.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/test/test-util.c b/src/test/test-util.c
index 57fd19b2a3..93f11eb6e9 100644
--- a/src/test/test-util.c
+++ b/src/test/test-util.c
@@ -1336,10 +1336,16 @@ static void test_raw_clone(void) {
pid2 = raw_getpid();
log_info("raw_clone: "PID_FMT" getpid()→"PID_FMT" raw_getpid()→"PID_FMT,
pid, getpid(), pid2);
- if (pid == 0)
+ if (pid == 0) {
assert_se(pid2 != parent);
- else
+ _exit(EXIT_SUCCESS);
+ } else {
+ int status;
+
assert_se(pid2 == parent);
+ waitpid(pid, &status, __WCLONE);
+ assert_se(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
+ }
}
int main(int argc, char *argv[]) {