From 0c832e30bfc6bbaaeb5e7b09039b0c249e196021 Mon Sep 17 00:00:00 2001 From: Vladimir Ilmov Date: Thu, 16 Jul 2020 16:01:34 +0200 Subject: [PATCH] (CoroutineDebugger) Memory leak fixed on IDEA quit: 'org.jetbrains.kotlin.idea.debugger.coroutine.view.XCoroutineView #KT-40386 fixed --- .../debugger/coroutine/DebuggerConnection.kt | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/DebuggerConnection.kt b/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/DebuggerConnection.kt index 25069da7108..da8a15d957b 100644 --- a/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/DebuggerConnection.kt +++ b/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/DebuggerConnection.kt @@ -35,8 +35,7 @@ class DebuggerConnection( val params: JavaParameters?, val runnerSettings: DebuggingRunnerData?, modifyArgs: Boolean = true -) : XDebuggerManagerListener { - var disposable: Disposable? = null +) : XDebuggerManagerListener, Disposable { var connection: MessageBusConnection? = null private val log by logger @@ -87,21 +86,15 @@ class DebuggerConnection( override fun processStarted(debugProcess: XDebugProcess) { DebuggerInvocationUtil.swingInvokeLater(project) { if (debugProcess is JavaDebugProcess) { - disposable = registerXCoroutinesPanel(debugProcess.session) + registerXCoroutinesPanel(debugProcess.session)?.let { + Disposer.register(this, it) + } } } } override fun processStopped(debugProcess: XDebugProcess) { - val rootDisposable = disposable - if (rootDisposable is Disposable && debugProcess is JavaDebugProcess && debugProcess.session.suspendContext is SuspendContextImpl) { - ManagerThreadExecutor(debugProcess).on(debugProcess.session.suspendContext).invoke { - Disposer.dispose(rootDisposable) - disposable = null - } - } - connection?.disconnect() - connection = null + Disposer.dispose(this) } private fun registerXCoroutinesPanel(session: XDebugSession): Disposable? { @@ -119,6 +112,11 @@ class DebuggerConnection( val param = createContentParamProvider.createContentParams() return ui.createContent(param.id, param.component, param.displayName, param.icon, param.parentComponent) } + + override fun dispose() { + connection?.disconnect() + connection = null + } } enum class CoroutineDebuggerMode {