lldb can interrupt waitpid, so EINTR shouldn't be an error. This fixes the case
authorJulien Lerouge <jlerouge@apple.com>
Fri, 27 Jun 2014 18:02:54 +0000 (18:02 +0000)
committerJulien Lerouge <jlerouge@apple.com>
Fri, 27 Jun 2014 18:02:54 +0000 (18:02 +0000)
where there is no timeout. In the case where there is a timeout though, the
code is still wrong since it doesn't check that the alarm really went off.

Without this patch, I cannot debug a program that forks itself using
sys::ExecuteAndWait with lldb.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211918 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Support/Unix/Program.inc

index 50f973a850b6c24b8a2b4296de502c8566933be8..06a33cd7790f22048cbdadebca38d1c6a39012d8 100644 (file)
@@ -350,7 +350,11 @@ ProcessInfo sys::Wait(const ProcessInfo &PI, unsigned SecondsToWait,
   // Parent process: Wait for the child process to terminate.
   int status;
   ProcessInfo WaitResult;
-  WaitResult.Pid = waitpid(ChildPid, &status, WaitPidOptions);
+
+  do {
+    WaitResult.Pid = waitpid(ChildPid, &status, WaitPidOptions);
+  } while (WaitUntilTerminates && WaitResult.Pid == -1 && errno == EINTR);
+
   if (WaitResult.Pid != PI.Pid) {
     if (WaitResult.Pid == 0) {
       // Non-blocking wait.