Skip to content

Commit 870df66

Browse files
Don't reopen the coverage file each time; on windows that is very slow.
1 parent 2acb521 commit 870df66

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

src/main/scala/scoverage/IOUtils.scala

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@ object IOUtils {
1414
def clean(dataDir: String): Unit = clean(new File(dataDir))
1515

1616
def coverageFile(dataDir: File): File = coverageFile(dataDir.getAbsolutePath)
17-
def coverageFile(dataDir: String): File = new File(dataDir + "/" + CoverageFileName)
17+
def coverageFile(dataDir: String): File = new File(dataDir, CoverageFileName)
1818

19+
/**
20+
* @return the measurement file for the current thread.
21+
*/
1922
def measurementFile(dataDir: File): File = measurementFile(dataDir.getAbsolutePath)
20-
def measurementFile(dataDir: String): File = new File(dataDir + "/" + MeasurementsPrefix + Thread.currentThread.getId)
23+
def measurementFile(dataDir: String): File = new File(dataDir, MeasurementsPrefix + Thread.currentThread.getId)
2124

2225
def findMeasurementFiles(dataDir: String): Array[File] = findMeasurementFiles(new File(dataDir))
2326
def findMeasurementFiles(dataDir: File): Array[File] = dataDir.listFiles(new FileFilter {
@@ -141,4 +144,4 @@ object IOUtils {
141144
reader.close()
142145
coverage
143146
}
144-
}
147+
}

src/main/scala/scoverage/Invoker.scala

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import java.io.FileWriter
55
/** @author Stephen Samuel */
66
object Invoker {
77

8+
val threadFile = new ThreadLocal[FileWriter]
9+
810
/**
911
* We record that the given id has been invoked by appending its id to the coverage
1012
* data file.
@@ -23,9 +25,12 @@ object Invoker {
2325
def invoked(id: Int, dataDir: String) = {
2426
// Each thread writes to a separate measurement file, to reduce contention
2527
// and because file appends via FileWriter are not atomic on Windows.
26-
val file = IOUtils.measurementFile(dataDir)
27-
val writer = new FileWriter(file, true)
28-
writer.append(id.toString + ';')
29-
writer.close()
28+
var writer = threadFile.get()
29+
if (writer == null) {
30+
val file = IOUtils.measurementFile(dataDir)
31+
writer = new FileWriter(file, true)
32+
threadFile.set(writer)
33+
}
34+
writer.append(id.toString + ';').flush()
3035
}
31-
}
36+
}

0 commit comments

Comments
 (0)