diff options
author | Paul Phillips <paulp@improving.org> | 2011-02-22 19:33:51 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-02-22 19:33:51 +0000 |
commit | 6961f663710ac4b61b4f6ef6dd3a34ff9ff7ca00 (patch) | |
tree | df4466c3ba8a91f1be915b65f9eccb0591096551 /src/library/scala/sys/process/ProcessBuilderImpl.scala | |
parent | 8aaca8c135d6dcbc56b9bba92cd95ea5ea0a7e3c (diff) | |
download | scala-6961f663710ac4b61b4f6ef6dd3a34ff9ff7ca00.tar.gz scala-6961f663710ac4b61b4f6ef6dd3a34ff9ff7ca00.tar.bz2 scala-6961f663710ac4b61b4f6ef6dd3a34ff9ff7ca00.zip |
Added daemonized() method to ProcessBuilder so ...
Added daemonized() method to ProcessBuilder so I can do things like
start fsc without the jvm failing to exit. More logging to fsc. scala -e
'5' now works again. Closes #4254, review by harrah.
Diffstat (limited to 'src/library/scala/sys/process/ProcessBuilderImpl.scala')
-rw-r--r-- | src/library/scala/sys/process/ProcessBuilderImpl.scala | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/library/scala/sys/process/ProcessBuilderImpl.scala b/src/library/scala/sys/process/ProcessBuilderImpl.scala index adca575d4d..4f6d5211f3 100644 --- a/src/library/scala/sys/process/ProcessBuilderImpl.scala +++ b/src/library/scala/sys/process/ProcessBuilderImpl.scala @@ -18,6 +18,10 @@ import Uncloseable.protect private[process] trait ProcessBuilderImpl { self: ProcessBuilder.type => + private[process] class DaemonBuilder(underlying: ProcessBuilder) extends AbstractBuilder { + final def run(io: ProcessIO): Process = underlying.run(io.daemonized()) + } + private[process] class Dummy(override val toString: String, exitValue: => Int) extends AbstractBuilder { override def run(io: ProcessIO): Process = new DummyProcess(exitValue) override def canPipeTo = true @@ -49,10 +53,10 @@ private[process] trait ProcessBuilderImpl { override def run(io: ProcessIO): Process = { val success = new SyncVar[Boolean] success put false - val t = Spawn { + val t = Spawn({ runImpl(io) success set true - } + }, io.daemonizeThreads) new ThreadProcess(t, success) } @@ -66,10 +70,10 @@ private[process] trait ProcessBuilderImpl { // spawn threads that process the input, output, and error streams using the functions defined in `io` val inThread = Spawn(writeInput(process.getOutputStream), true) - val outThread = Spawn(processOutput(process.getInputStream)) + val outThread = Spawn(processOutput(process.getInputStream), daemonizeThreads) val errorThread = if (p.redirectErrorStream) Nil - else List(Spawn(processError(process.getErrorStream))) + else List(Spawn(processError(process.getErrorStream), daemonizeThreads)) new SimpleProcess(process, inThread, outThread :: errorThread) } @@ -110,6 +114,8 @@ private[process] trait ProcessBuilderImpl { def !< = run(true).exitValue() def !<(log: ProcessLogger) = runBuffered(log, true) + def daemonized(): ProcessBuilder = new DaemonBuilder(this) + private[this] def slurp(log: Option[ProcessLogger], withIn: Boolean): String = { val buffer = new StringBuffer val code = this ! BasicIO(withIn, buffer, log) |