Skip to content

Commit

Permalink
defer opening logging output files until an actual write
Browse files Browse the repository at this point in the history
  • Loading branch information
harrah committed Aug 27, 2012
1 parent cbaa805 commit 29dd76d
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 1 deletion.
2 changes: 1 addition & 1 deletion tasks/standard/Streams.scala
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ object Streams
make(a, sid)(f => new BufferedInputStream(new FileInputStream(f)))

def text(sid: String = default): PrintWriter =
make(a, sid)(f => new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), IO.defaultCharset))) )
make(a, sid)(f => new PrintWriter(new DeferredWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), IO.defaultCharset)))) )

def binary(sid: String = default): BufferedOutputStream =
make(a, sid)(f => new BufferedOutputStream(new FileOutputStream(f)))
Expand Down
29 changes: 29 additions & 0 deletions util/io/DeferredWriter.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package sbt

import java.io.Writer

final class DeferredWriter(make: => Writer) extends Writer
{
private[this] var opened = false
private[this] var delegate0: Writer = _
private[this] def delegate: Writer = synchronized {
if(delegate0 eq null) {
delegate0 = make
opened = true
}
delegate0
}
override def close() = synchronized {
if(opened) delegate0.close()
}

override def append(c: Char): Writer = delegate.append(c)
override def append(csq: CharSequence): Writer = delegate.append(csq)
override def append(csq: CharSequence, start: Int, end: Int): Writer = delegate.append(csq, start, end)
override def flush() = delegate.flush()
override def write(cbuf: Array[Char]) = delegate.write(cbuf)
override def write(cbuf: Array[Char], off: Int, len: Int): Unit = delegate.write(cbuf, off, len)
override def write(c: Int): Unit = delegate.write(c)
override def write(s: String): Unit = delegate.write(s)
override def write(s: String, off: Int, len: Int): Unit = delegate.write(s, off, len)
}

0 comments on commit 29dd76d

Please sign in to comment.