[debugger] IDEA-356844 Replace blocking read action with nonBlocking

* add logging when runBlockingMaybeCancellable is called from a read action without progress

GitOrigin-RevId: 43d4852dcd8c78f1346836d717812f6b9f9dddef
This commit is contained in:
Maksim Zuev
2024-07-31 17:29:23 +02:00
committed by intellij-monorepo-bot
parent 06dd82b6d1
commit 87b602ece4
2 changed files with 15 additions and 5 deletions

View File

@@ -17,10 +17,12 @@ import com.intellij.debugger.jdi.VirtualMachineProxyImpl
import com.intellij.debugger.requests.ClassPrepareRequestor
import com.intellij.debugger.ui.breakpoints.Breakpoint
import com.intellij.debugger.ui.impl.watch.StackFrameDescriptorImpl
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.readAction
import com.intellij.openapi.application.runReadAction
import com.intellij.openapi.application.smartReadAction
import com.intellij.openapi.fileTypes.FileType
import com.intellij.openapi.progress.ProgressManager
import com.intellij.openapi.progress.runBlockingMaybeCancellable
import com.intellij.openapi.project.DumbService
import com.intellij.openapi.project.Project
@@ -129,8 +131,15 @@ class KotlinPositionManager(private val debugProcess: DebugProcess) : MultiReque
getSourcePositionInternal(location)
}
override fun getSourcePosition(location: Location?): SourcePosition? = runBlockingMaybeCancellable {
getSourcePositionInternal(location)
override fun getSourcePosition(location: Location?): SourcePosition? {
if (ApplicationManager.getApplication().isInternal
&& ApplicationManager.getApplication().isReadAccessAllowed
&& !ProgressManager.getInstance().hasProgressIndicator()) {
LOG.error("Call runBlocking from read action without indicator")
}
return runBlockingMaybeCancellable {
getSourcePositionInternal(location)
}
}
private suspend fun getSourcePositionInternal(location: Location?): SourcePosition? {

View File

@@ -7,7 +7,7 @@ import com.intellij.debugger.engine.SuspendContextImpl
import com.intellij.debugger.impl.DebuggerUtilsEx
import com.intellij.debugger.jdi.StackFrameProxyImpl
import com.intellij.debugger.jdi.ThreadReferenceProxyImpl
import com.intellij.openapi.application.runReadAction
import com.intellij.openapi.application.ReadAction
import com.sun.jdi.*
import org.jetbrains.kotlin.idea.debugger.base.util.*
import org.jetbrains.kotlin.idea.debugger.base.util.evaluate.DefaultExecutionContext
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.idea.debugger.core.canRunEvaluation
import org.jetbrains.kotlin.idea.debugger.core.invokeInManagerThread
import org.jetbrains.kotlin.idea.debugger.coroutine.data.SuspendExitMode
import org.jetbrains.kotlin.idea.util.application.isUnitTestMode
import java.util.concurrent.Callable
const val CREATION_STACK_TRACE_SEPARATOR = "\b\b\b" // the "\b\b\b" is used as creation stacktrace separator in kotlinx.coroutines
const val CREATION_CLASS_NAME = "_COROUTINE._CREATION"
@@ -94,9 +95,9 @@ fun StackTraceElement.isCreationSeparatorFrame() =
className.startsWith(CREATION_STACK_TRACE_SEPARATOR) ||
className == CREATION_CLASS_NAME
fun Location.findPosition(debugProcess: DebugProcessImpl) = runReadAction {
fun Location.findPosition(debugProcess: DebugProcessImpl) = ReadAction.nonBlocking(Callable {
DebuggerUtilsEx.toXSourcePosition(debugProcess.positionManager.getSourcePosition(this))
}
}).executeSynchronously()
fun SuspendContextImpl.executionContext() = invokeInManagerThread { DefaultExecutionContext(this, this.frameProxy) }