in trace/src/main/org/jetbrains/lincheck/trace/Deserialization.kt [374:411]
fun readRoots(): List<TRTracePoint> {
var start = System.currentTimeMillis()
loadContext()
Logger.debug { "Context loaded in ${System.currentTimeMillis() - start} ms" }
start = System.currentTimeMillis()
val roots = mutableMapOf<Int, TRTracePoint>()
dataBlocks.forEach {
val (threadId, blocks) = it
data.seek(blocks.first().physicalStart)
val kind = data.readKind()
check(kind == ObjectKind.BLOCK_START) { "Thread $threadId block 0 has wrong start: $kind" }
val blockId = data.readInt()
check(blockId == threadId) { "Thread $threadId block 0 has wrong idt: $blockId" }
val tracepoints = mutableListOf<TRTracePoint>()
loadTracePoints(
threadId = threadId,
maxRead = Integer.MAX_VALUE,
reader = this::readTracePointWithPostprocessor,
registrator = { _, tracePoint, _ ->
if (tracePoint != null) tracepoints.add(tracePoint)
}
)
if (tracepoints.isEmpty()) {
Logger.warn { "Thread $threadId doesn't write any tracepoints" }
} else {
if (tracepoints.size > 1) {
Logger.error { "Thread $threadId wrote too many root tracepoints: ${tracepoints.size}" }
}
roots[threadId] = tracepoints.first()
}
}
Logger.debug { "Roots loaded in ${System.currentTimeMillis() - start} ms" }
return roots.entries.sortedBy { it.key }.map { (_, tracePoint) -> tracePoint }
}