[libc-commits] [PATCH] D76267: [libc] Resolve race condition in sub-process test runner.

Paula Toth via Phabricator via libc-commits libc-commits at lists.llvm.org
Mon Mar 16 22:00:35 PDT 2020

PaulkaToast created this revision.
PaulkaToast added reviewers: sivachandra, abrachet.
PaulkaToast added a project: libc-project.
Herald added subscribers: libc-commits, tschuett, jfb, MaskRay.

There seems to be a race condition between the pipe closing and the child process death. Likely these two events are not atomic on some versions of linux.

With the removal of `WNOHANG` we eliminate the race condition, however if the child closes the pipe intentionally then it could result in the test runner hanging. I find this situation less likely, where as I experience failures locally with this race condition rather consistently.

  rG LLVM Github Monorepo



Index: libc/utils/testutils/ExecuteFunctionUnix.cpp
--- libc/utils/testutils/ExecuteFunctionUnix.cpp
+++ libc/utils/testutils/ExecuteFunctionUnix.cpp
@@ -67,8 +67,10 @@
   int WStatus = 0;
-  int status = ::waitpid(Pid, &WStatus, WNOHANG);
-  assert(status == Pid && "wait call should not block here");
+  pid_t status = ::waitpid(Pid, &WStatus, 0);
+  if (status == -1)
+    return ProcessStatus::Error("waitpid(2) failed");
+  assert(status == Pid);
   return {WStatus};

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D76267.250691.patch
Type: text/x-patch
Size: 568 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libc-commits/attachments/20200317/05478da9/attachment.bin>

More information about the libc-commits mailing list