From 86ebb340effcb5b8143bcf6e90e1c5186b3103d1 Mon Sep 17 00:00:00 2001 From: Julien Lerouge Date: Fri, 27 Jun 2014 18:02:54 +0000 Subject: lldb can interrupt waitpid, so EINTR shouldn't be an error. This fixes the case 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 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/Support/Unix/Program.inc b/lib/Support/Unix/Program.inc index 50f973a850..06a33cd779 100644 --- a/lib/Support/Unix/Program.inc +++ b/lib/Support/Unix/Program.inc @@ -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. -- cgit v1.2.3