From 5ea74ed562c21160b2b46abf5f11717253ca7172 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 15 Jul 2016 16:05:09 +0300 Subject: [PATCH] Remove call invokeAndWait() under read lock in debugger (KT-13037) Call to invokeAndWait() in dispatch thread or in situation when read lock isn't held left untouched. Can't remove invokeAndWait() completely because without the progress bar idea looks to be stacked on debugger start because of long search for inline functions usages (searching for breakpoints places). #KT-13037 Fixed --- ChangeLog.md | 1 + .../idea/debugger/KotlinPositionManager.kt | 25 ++++++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 3b5e0a76bdc..c1613012a67 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -109,6 +109,7 @@ These artifacts include extensions for the types available in the latter JDKs, s ###### Issues fixed - [`KT-13059`](https://youtrack.jetbrains.com/issue/KT-13059) Fix error stepping on *Step Over* action in the end of while block +- [`KT-13037`](https://youtrack.jetbrains.com/issue/KT-13037) Fix possible deadlock in debugger in 2016.1 and exception in 2016.2 ## 1.0.3 diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt index 53d914f731a..c5f6c09c535 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt @@ -25,8 +25,8 @@ import com.intellij.debugger.engine.PositionManagerEx import com.intellij.debugger.engine.evaluation.EvaluationContext import com.intellij.debugger.jdi.StackFrameProxyImpl import com.intellij.debugger.requests.ClassPrepareRequestor -import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.ModalityState +import com.intellij.openapi.application.ex.ApplicationManagerEx import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.project.DumbService import com.intellij.openapi.roots.libraries.LibraryUtil @@ -468,14 +468,21 @@ class KotlinPositionManager(private val myDebugProcess: DebugProcess) : MultiReq } var isSuccess = true - ApplicationManager.getApplication().invokeAndWait( - { - isSuccess = ProgressManager.getInstance().runProcessWithProgressSynchronously( - task, - "Compute class names for function $functionName", - true, - myDebugProcess.project) - }, ModalityState.NON_MODAL) + val applicationEx = ApplicationManagerEx.getApplicationEx() + if (!applicationEx.holdsReadLock() || applicationEx.isDispatchThread) { + applicationEx.invokeAndWait( + { + isSuccess = ProgressManager.getInstance().runProcessWithProgressSynchronously( + task, + "Compute class names for function $functionName", + true, + myDebugProcess.project) + }, ModalityState.NON_MODAL) + } + else { + // Pooled thread with read lock. Can't invoke task under UI progress, so call it directly. + task.run() + } if (!isSuccess) { XDebugSessionImpl.NOTIFICATION_GROUP.createNotification(