diff --git a/src/main/scala/scoverage/IOUtils.scala b/src/main/scala/scoverage/IOUtils.scala index 78d5b663..0b41ad6d 100644 --- a/src/main/scala/scoverage/IOUtils.scala +++ b/src/main/scala/scoverage/IOUtils.scala @@ -14,10 +14,13 @@ object IOUtils { def clean(dataDir: String): Unit = clean(new File(dataDir)) def coverageFile(dataDir: File): File = coverageFile(dataDir.getAbsolutePath) - def coverageFile(dataDir: String): File = new File(dataDir + "/" + CoverageFileName) + def coverageFile(dataDir: String): File = new File(dataDir, CoverageFileName) + /** + * @return the measurement file for the current thread. + */ def measurementFile(dataDir: File): File = measurementFile(dataDir.getAbsolutePath) - def measurementFile(dataDir: String): File = new File(dataDir + "/" + MeasurementsPrefix + Thread.currentThread.getId) + def measurementFile(dataDir: String): File = new File(dataDir, MeasurementsPrefix + Thread.currentThread.getId) def findMeasurementFiles(dataDir: String): Array[File] = findMeasurementFiles(new File(dataDir)) def findMeasurementFiles(dataDir: File): Array[File] = dataDir.listFiles(new FileFilter { @@ -141,4 +144,4 @@ object IOUtils { reader.close() coverage } -} \ No newline at end of file +} diff --git a/src/main/scala/scoverage/Invoker.scala b/src/main/scala/scoverage/Invoker.scala index 0ef0645a..cf870691 100644 --- a/src/main/scala/scoverage/Invoker.scala +++ b/src/main/scala/scoverage/Invoker.scala @@ -5,6 +5,8 @@ import java.io.FileWriter /** @author Stephen Samuel */ object Invoker { + val threadFile = new ThreadLocal[FileWriter] + /** * We record that the given id has been invoked by appending its id to the coverage * data file. @@ -23,9 +25,12 @@ object Invoker { def invoked(id: Int, dataDir: String) = { // Each thread writes to a separate measurement file, to reduce contention // and because file appends via FileWriter are not atomic on Windows. - val file = IOUtils.measurementFile(dataDir) - val writer = new FileWriter(file, true) - writer.append(id.toString + ';') - writer.close() + var writer = threadFile.get() + if (writer == null) { + val file = IOUtils.measurementFile(dataDir) + writer = new FileWriter(file, true) + threadFile.set(writer) + } + writer.append(id.toString + ';').flush() } -} \ No newline at end of file +}