From b453a8e616f489e077f8edcd95623b07484e7b8b Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Fri, 2 Dec 2016 22:24:42 +0100 Subject: check waitpid() return value before setting exitStatus This fixes a race with parallelBuild on DragonFly BSD. --- lib/pure/osproc.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/pure/osproc.nim') diff --git a/lib/pure/osproc.nim b/lib/pure/osproc.nim index 76bd2dfe1..f597bf773 100644 --- a/lib/pure/osproc.nim +++ b/lib/pure/osproc.nim @@ -965,7 +965,7 @@ elif not defined(useNimRtl): var ret : int var status : cint = 1 ret = waitpid(p.id, status, WNOHANG) - if WIFEXITED(status): + if ret == int(p.id) and WIFEXITED(status): p.exitStatus = status if ret == 0: return true # Can't establish status. Assume running. result = ret == int(p.id) -- cgit 1.4.1-2-gfad0 From 95188edf6fe63ee3fe8341b1b5c2e7b92beb3415 Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Sat, 3 Dec 2016 14:07:08 +0100 Subject: make sure first call to running() after process exit returns false --- lib/pure/osproc.nim | 14 ++++++++++---- tests/osproc/texitcode.nim | 5 +++++ 2 files changed, 15 insertions(+), 4 deletions(-) (limited to 'lib/pure/osproc.nim') diff --git a/lib/pure/osproc.nim b/lib/pure/osproc.nim index f597bf773..1d43bb321 100644 --- a/lib/pure/osproc.nim +++ b/lib/pure/osproc.nim @@ -965,10 +965,16 @@ elif not defined(useNimRtl): var ret : int var status : cint = 1 ret = waitpid(p.id, status, WNOHANG) - if ret == int(p.id) and WIFEXITED(status): - p.exitStatus = status - if ret == 0: return true # Can't establish status. Assume running. - result = ret == int(p.id) + if ret == int(p.id): + if WIFEXITED(status): + p.exitStatus = status + return false + else: + return true + elif ret == 0: + return true # Can't establish status. Assume running. + else: + return false proc terminate(p: Process) = if kill(p.id, SIGTERM) != 0'i32: diff --git a/tests/osproc/texitcode.nim b/tests/osproc/texitcode.nim index 1e83658c2..4eaab6da2 100644 --- a/tests/osproc/texitcode.nim +++ b/tests/osproc/texitcode.nim @@ -16,3 +16,8 @@ var running = true while running: running = running(p) doAssert(waitForExit(p) == QuitFailure) + +# make sure that first call to running() after process exit returns false +p = startProcess(filename, dir) +os.sleep(500) +doAssert(not running(p)) -- cgit 1.4.1-2-gfad0