in trace-recorder/src/main/org/jetbrains/lincheck/trace/recorder/TraceRecorder.kt [89:125]
fun finishTraceAndDumpResults() {
val startedCount = installCount.decrementAndGet()
Logger.info { "Trace recorder has been stopped in thread \"${Thread.currentThread().name}\" (installCount=$startedCount)" }
if (startedCount > 0) {
// Try to deregister itself as the root descriptor if we started tracing
if (traceStarterThread == Thread.currentThread()) {
val descriptor = ThreadDescriptor.getCurrentThreadDescriptor() ?: return
ThreadDescriptor.unsetRootThread().ensure { it == descriptor }
traceStarterThread = null
}
return
}
if (startedCount < 0) {
Logger.error { "Recording has been stopped more times than started: $startedCount (${Thread.currentThread().name})" }
return
}
// this method does not need 'runInsideIgnoredSection' because we do not call instrumented code,
// and we call `disableAnalysis` as a first action
val descriptor = ThreadDescriptor.getCurrentThreadDescriptor() ?: return
descriptor.disableAnalysis()
if (eventTracker != Injections.getEventTracker(descriptor)) {
Logger.warn { "Unexpected event tracker observed during trace finishing" }
}
val mode = Injections.getEventTrackingMode()
if (mode == Injections.EventTrackingMode.GLOBAL) {
Injections.disableGlobalEventTracking()
} else {
throw IllegalStateException("Unexpected event tracking mode $mode")
}
eventTracker?.finishAndDumpTrace()
eventTracker = null
}