From 45f652e67cc4788b356000b7fa4cab1a74f1bbd8 Mon Sep 17 00:00:00 2001 From: Alex Plate Date: Thu, 14 May 2020 16:17:16 +0300 Subject: [PATCH] [Workspace Model] Get dispose stack trace only if Disposer.isDebug enabled (RootModel) GitOrigin-RevId: 8c129c6d91aaaa0d81143927b56aa9868e3e7323 --- .../module/RootModelViaTypedEntityImpl.kt | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/platform/workspaceModel-ide/src/com/intellij/workspace/legacyBridge/typedModel/module/RootModelViaTypedEntityImpl.kt b/platform/workspaceModel-ide/src/com/intellij/workspace/legacyBridge/typedModel/module/RootModelViaTypedEntityImpl.kt index 294dc3d76bc8..7012974fadf6 100644 --- a/platform/workspaceModel-ide/src/com/intellij/workspace/legacyBridge/typedModel/module/RootModelViaTypedEntityImpl.kt +++ b/platform/workspaceModel-ide/src/com/intellij/workspace/legacyBridge/typedModel/module/RootModelViaTypedEntityImpl.kt @@ -24,6 +24,7 @@ import com.intellij.workspace.legacyBridge.libraries.libraries.LegacyBridgeLibra import org.jdom.Element import org.jetbrains.annotations.NotNull import java.util.* +import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicReference import kotlin.collections.HashMap @@ -79,11 +80,22 @@ internal class RootModelViaTypedEntityImpl(internal val moduleEntityId: Persiste } } - private val disposed = AtomicReference(null) + private var disposedStackTrace: Throwable? = null + private val isDisposed = AtomicBoolean(false) + override fun dispose() { (filePointerProvider as? LegacyBridgeFilePointerProviderImpl)?.disposeAndClearCaches() - val disposedStackTrace = disposed.getAndSet(Throwable()) - if (disposedStackTrace != null) throw IllegalStateException("${javaClass.name} was already disposed", disposedStackTrace) + + val alreadyDisposed = isDisposed.getAndSet(true) + if (alreadyDisposed) { + val trace = disposedStackTrace + if (trace != null) { + throw IllegalStateException("${javaClass.name} was already disposed", trace) + } + else throw IllegalStateException("${javaClass.name} was already disposed") + } else if (Disposer.isDebugMode()) { + disposedStackTrace = Throwable() + } } override fun getModule(): LegacyBridgeModule = module