fun readRoots()

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 }
    }