From 5c682f6bfa800f459b56b3e7a55209a0cf4cba4c Mon Sep 17 00:00:00 2001 From: FalsePattern Date: Thu, 20 Mar 2025 00:10:31 +0100 Subject: [PATCH] fix: EDT deadlocks --- CHANGELOG.md | 1 + .../ZigDefaultDebuggerDriverConfigurationProvider.kt | 5 +++-- .../zigbrains/debugger/runner/base/ZigDebugRunnerBase.kt | 3 ++- .../falsepattern/zigbrains/project/run/ZigRegularRunner.kt | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 40fb68bc..3dd62c9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ Changelog structure reference: - Project - mkfifo/bash for zig progress visualization is now detected more reliably (fixes error on macOS) + - Deadlock when launching zig build tasks ## [23.0.0] diff --git a/cidr/src/main/kotlin/com/falsepattern/zigbrains/debugger/ZigDefaultDebuggerDriverConfigurationProvider.kt b/cidr/src/main/kotlin/com/falsepattern/zigbrains/debugger/ZigDefaultDebuggerDriverConfigurationProvider.kt index 7a1676b9..d3b5294b 100644 --- a/cidr/src/main/kotlin/com/falsepattern/zigbrains/debugger/ZigDefaultDebuggerDriverConfigurationProvider.kt +++ b/cidr/src/main/kotlin/com/falsepattern/zigbrains/debugger/ZigDefaultDebuggerDriverConfigurationProvider.kt @@ -27,6 +27,7 @@ import com.falsepattern.zigbrains.debugger.toolchain.* import com.falsepattern.zigbrains.debugger.win.MSVCDriverConfiguration import com.falsepattern.zigbrains.shared.coroutine.withEDTContext import com.falsepattern.zigbrains.zig.ZigLanguage +import com.intellij.openapi.application.ModalityState import com.intellij.openapi.project.Project import com.intellij.openapi.ui.DoNotAskOption import com.intellij.openapi.ui.MessageDialogBuilder @@ -85,7 +86,7 @@ private suspend fun availabilityCheck(project: Project, kind: DebuggerKind): Boo } if (downloadDebugger) { - val result = withEDTContext { + val result = withEDTContext(ModalityState.any()) { service.downloadDebugger(project, kind) } if (result is ZigDebuggerToolchainService.DownloadResult.Ok) { @@ -104,7 +105,7 @@ private suspend fun showDialog(project: Project, message: String, action: String } } - return withEDTContext { + return withEDTContext(ModalityState.any()) { MessageDialogBuilder .okCancel(ZigDebugBundle.message("debugger.run.unavailable"), message) .yesText(action) diff --git a/cidr/src/main/kotlin/com/falsepattern/zigbrains/debugger/runner/base/ZigDebugRunnerBase.kt b/cidr/src/main/kotlin/com/falsepattern/zigbrains/debugger/runner/base/ZigDebugRunnerBase.kt index 297045cb..4bb92371 100644 --- a/cidr/src/main/kotlin/com/falsepattern/zigbrains/debugger/runner/base/ZigDebugRunnerBase.kt +++ b/cidr/src/main/kotlin/com/falsepattern/zigbrains/debugger/runner/base/ZigDebugRunnerBase.kt @@ -40,6 +40,7 @@ import com.intellij.execution.runners.RunContentBuilder import com.intellij.execution.ui.ConsoleView import com.intellij.execution.ui.ConsoleViewContentType import com.intellij.execution.ui.RunContentDescriptor +import com.intellij.openapi.application.ModalityState import com.intellij.platform.util.progress.reportProgress import com.intellij.xdebugger.XDebugProcess import com.intellij.xdebugger.XDebugProcessStarter @@ -86,7 +87,7 @@ abstract class ZigDebugRunnerBase> : ZigProgra } if (listener.isBuildFailed) { val executionResult = DefaultExecutionResult(console, listener.processHandler) - return@reportProgress withEDTContext { + return@reportProgress withEDTContext(ModalityState.any()) { val runContentBuilder = RunContentBuilder(executionResult, environment) runContentBuilder.showRunContent(null) } diff --git a/core/src/main/kotlin/com/falsepattern/zigbrains/project/run/ZigRegularRunner.kt b/core/src/main/kotlin/com/falsepattern/zigbrains/project/run/ZigRegularRunner.kt index d2d7638a..7dce5c9c 100644 --- a/core/src/main/kotlin/com/falsepattern/zigbrains/project/run/ZigRegularRunner.kt +++ b/core/src/main/kotlin/com/falsepattern/zigbrains/project/run/ZigRegularRunner.kt @@ -32,12 +32,13 @@ import com.intellij.execution.executors.DefaultRunExecutor import com.intellij.execution.runners.ExecutionEnvironment import com.intellij.execution.runners.RunContentBuilder import com.intellij.execution.ui.RunContentDescriptor +import com.intellij.openapi.application.ModalityState class ZigRegularRunner: ZigProgramRunner>(DefaultRunExecutor.EXECUTOR_ID) { override suspend fun execute(state: ZigProfileState<*>, toolchain: AbstractZigToolchain, environment: ExecutionEnvironment): RunContentDescriptor? { val cli = state.getCommandLine(toolchain, false) val exec = executeCommandLine(cli, environment) - return withEDTContext { + return withEDTContext(ModalityState.any()) { val runContentBuilder = RunContentBuilder(exec, environment) runContentBuilder.showRunContent(null) }