diff options
author | dom96 <dominikpicheta@googlemail.com> | 2011-08-03 22:38:21 +0100 |
---|---|---|
committer | dom96 <dominikpicheta@googlemail.com> | 2011-08-03 22:38:21 +0100 |
commit | 3e660efeb46a0c73bd3372c4006bf89050b94774 (patch) | |
tree | fdfcf1f00a79c3827572b0f0f054e90bc7cbb712 /lib/pure | |
parent | 7670466d433ea9b0e2f34c3a6720e7172089c71c (diff) | |
download | Nim-3e660efeb46a0c73bd3372c4006bf89050b94774.tar.gz |
Fixed osproc.terminate for posix and improved some other osproc posix functions.
Diffstat (limited to 'lib/pure')
-rwxr-xr-x | lib/pure/osproc.nim | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/lib/pure/osproc.nim b/lib/pure/osproc.nim index 0beaf710f..bf5dc7970 100755 --- a/lib/pure/osproc.nim +++ b/lib/pure/osproc.nim @@ -496,6 +496,9 @@ elif not defined(useNimRtl): else: if dup2(p_stderr[writeIdx], 2) < 0: OSError() + # Create a new process group + if setpgid(0, 0) == -1: quit("setpgid call failed: " & $strerror(errno)) + if workingDir.len > 0: os.setCurrentDir(workingDir) if poUseShell notin options: var a = toCStringArray([extractFilename(command)], args) @@ -534,33 +537,39 @@ elif not defined(useNimRtl): discard close(p.errorHandle) proc suspend(p: PProcess) = - discard kill(p.id, SIGSTOP) + if kill(-p.id, SIGSTOP) != 0'i32: OSError() proc resume(p: PProcess) = - discard kill(p.id, SIGCONT) + if kill(-p.id, SIGCONT) != 0'i32: OSError() proc running(p: PProcess): bool = - result = waitPid(p.id, p.exitCode, WNOHANG) == int(p.id) + var ret = waitPid(p.id, p.exitCode, WNOHANG) + if ret == 0: return true # Can't establish status. Assume running. + result = ret == int(p.id) proc terminate(p: PProcess) = - if kill(p.id, SIGTERM) == 0'i32: - if running(p): discard kill(p.id, SIGKILL) + if kill(-p.id, SIGTERM) == 0'i32: + if p.running(): + if kill(-p.id, SIGKILL) != 0'i32: OSError() + else: OSError() proc waitForExit(p: PProcess): int = #if waitPid(p.id, p.exitCode, 0) == int(p.id): # ``waitPid`` fails if the process is not running anymore. But then # ``running`` probably set ``p.exitCode`` for us. Since ``p.exitCode`` is # initialized with -3, wrong success exit codes are prevented. - var oldExitCode = p.exitCode + if p.exitCode != -3: return p.exitCode if waitPid(p.id, p.exitCode, 0) < 0: - # failed, so restore old exitCode - p.exitCode = oldExitCode + p.exitCode = -3 + OSError() result = int(p.exitCode) proc peekExitCode(p: PProcess): int = - var b = waitPid(p.id, p.exitCode, WNOHANG) == int(p.id) + if p.exitCode != -3: return p.exitCode + var ret = waitPid(p.id, p.exitCode, WNOHANG) + var b = ret == int(p.id) if b: result = -1 - elif p.exitCode == -3: result = -1 + if p.exitCode == -3: result = -1 else: result = p.exitCode proc inputStream(p: PProcess): PStream = |