chiark / gitweb /
test: wait for cloned thread to exit
authorFilipe Brandenburger <filbranden@google.com>
Thu, 25 Dec 2014 16:40:46 +0000 (11:40 -0500)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 25 Dec 2014 16:55:12 +0000 (11:55 -0500)
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.]

src/test/test-util.c

index 57fd19b2a31ace097cb90fcbcf2e7cb73c091a5a..93f11eb6e90a2e2e6aca3926a417d81473b87ae4 100644 (file)
@@ -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[]) {