diff options
author | Adriaan Moors <adriaan.moors@typesafe.com> | 2013-05-17 16:16:20 -0700 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@typesafe.com> | 2013-05-17 16:16:20 -0700 |
commit | 8213a757a0f8f3cd00ff294301b877ac5e05cb92 (patch) | |
tree | 77703de75a7ea1dcd3c71a917a2548cd6b015573 /src/library | |
parent | aea3cbc91b31f482c05e65c3fd1c1b50164eda16 (diff) | |
parent | 538aa22ec8144430e778a34bc749eccb6f5dbf4c (diff) | |
download | scala-8213a757a0f8f3cd00ff294301b877ac5e05cb92.tar.gz scala-8213a757a0f8f3cd00ff294301b877ac5e05cb92.tar.bz2 scala-8213a757a0f8f3cd00ff294301b877ac5e05cb92.zip |
Merge pull request #2538 from som-snytt/issue/6488-process-io-destroy
SI-6488 Interrupt i/o threads on process destroy
Diffstat (limited to 'src/library')
-rw-r--r-- | src/library/scala/sys/process/BasicIO.scala | 28 | ||||
-rw-r--r-- | src/library/scala/sys/process/ProcessImpl.scala | 4 |
2 files changed, 20 insertions, 12 deletions
diff --git a/src/library/scala/sys/process/BasicIO.scala b/src/library/scala/sys/process/BasicIO.scala index 58517de402..b31bbf0540 100644 --- a/src/library/scala/sys/process/BasicIO.scala +++ b/src/library/scala/sys/process/BasicIO.scala @@ -162,21 +162,29 @@ object BasicIO { */ def processFully(processLine: String => Unit): InputStream => Unit = in => { val reader = new BufferedReader(new InputStreamReader(in)) - processLinesFully(processLine)(reader.readLine) - reader.close() + try processLinesFully(processLine)(reader.readLine) + finally reader.close() } /** Calls `processLine` with the result of `readLine` until the latter returns - * `null`. - */ + * `null` or the current thread is interrupted. + */ def processLinesFully(processLine: String => Unit)(readLine: () => String) { - def readFully() { - val line = readLine() - if (line != null) { - processLine(line) - readFully() + def working = (Thread.currentThread.isInterrupted == false) + def halting = { Thread.currentThread.interrupt(); null } + def readFully(): Unit = + if (working) { + val line = + try readLine() + catch { + case _: InterruptedException => halting + case e: IOException if !working => halting + } + if (line != null) { + processLine(line) + readFully() + } } - } readFully() } diff --git a/src/library/scala/sys/process/ProcessImpl.scala b/src/library/scala/sys/process/ProcessImpl.scala index 7a5fc4ef9b..2b7fcdeb73 100644 --- a/src/library/scala/sys/process/ProcessImpl.scala +++ b/src/library/scala/sys/process/ProcessImpl.scala @@ -223,8 +223,8 @@ private[process] trait ProcessImpl { p.exitValue() } override def destroy() = { - try{ - outputThreads foreach (_.stop()) + try { + outputThreads foreach (_.interrupt()) // on destroy, don't bother consuming any more output p.destroy() } finally inputThread.interrupt() |