From cf6d41b51d707452d3f2d193d3cf7d9767a15fce Mon Sep 17 00:00:00 2001 From: Dmitry Atamanov Date: Fri, 6 Apr 2018 11:09:05 +0300 Subject: Fixes #5281 (#7489) --- tests/osproc/tstdin.nim | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'tests/osproc') diff --git a/tests/osproc/tstdin.nim b/tests/osproc/tstdin.nim index d94c34192..9b49ed786 100644 --- a/tests/osproc/tstdin.nim +++ b/tests/osproc/tstdin.nim @@ -11,9 +11,8 @@ doAssert fileExists(getCurrentDir() / "tests" / "osproc" / filename) var p = startProcess(filename, getCurrentDir() / "tests" / "osproc") p.inputStream.write("5\n") p.inputStream.flush() -while true: - let line = p.outputStream.readLine() - if line != "": - echo line - else: - break + +var line = "" + +while p.outputStream.readLine(line.TaintedString): + echo line -- cgit 1.4.1-2-gfad0 From b2060acbc49ccface03a2350bf1c2e9ad456a75d Mon Sep 17 00:00:00 2001 From: Michał Zieliński Date: Mon, 16 Apr 2018 20:02:26 +0200 Subject: osproc: fix double close on POSIX (#5724) Calling close() in some cases issued two close() syscalls to one FD, which is incorrect in multithreaded programs. --- lib/pure/osproc.nim | 20 ++++++++++++++------ tests/osproc/tclose.nim | 24 ++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 tests/osproc/tclose.nim (limited to 'tests/osproc') diff --git a/lib/pure/osproc.nim b/lib/pure/osproc.nim index 555626514..a51b1f5ab 100644 --- a/lib/pure/osproc.nim +++ b/lib/pure/osproc.nim @@ -1001,13 +1001,21 @@ elif not defined(useNimRtl): {.pop} proc close(p: Process) = - if p.inStream != nil: close(p.inStream) - if p.outStream != nil: close(p.outStream) - if p.errStream != nil: close(p.errStream) if poParentStreams notin p.options: - discard close(p.inHandle) - discard close(p.outHandle) - discard close(p.errHandle) + if p.inStream != nil: + close(p.inStream) + else: + discard close(p.inHandle) + + if p.outStream != nil: + close(p.outStream) + else: + discard close(p.outHandle) + + if p.errStream != nil: + close(p.errStream) + else: + discard close(p.errHandle) proc suspend(p: Process) = if kill(p.id, SIGSTOP) != 0'i32: raiseOsError(osLastError()) diff --git a/tests/osproc/tclose.nim b/tests/osproc/tclose.nim new file mode 100644 index 000000000..d466b466a --- /dev/null +++ b/tests/osproc/tclose.nim @@ -0,0 +1,24 @@ +discard """ + exitcode: 0 +""" + +when defined(linux): + import osproc, os + + proc countFds(): int = + result = 0 + for i in walkDir("/proc/self/fd"): + result += 1 + + let initCount = countFds() + + let p = osproc.startProcess("echo", options={poUsePath}) + assert countFds() == initCount + 3 + p.close + assert countFds() == initCount + + let p1 = osproc.startProcess("echo", options={poUsePath}) + discard p1.inputStream + assert countFds() == initCount + 3 + p.close + assert countFds() == initCount -- cgit 1.4.1-2-gfad0