From 439bcb33ad32b302266dbcce5dafcb0eda4224a9 Mon Sep 17 00:00:00 2001 From: Konstantin Nisht Date: Mon, 2 Jun 2025 11:17:51 +0200 Subject: [PATCH] [threading] RUBY-34098: Terminate processes on EDT For an unknown reason, process termination requires write-intent read action. Previously the write-intent lock was acquired on a background thread, which interfered with active modal progresses. Now we dispatch process termination to EDT. We hope that process termination does not require write action (cherry picked from commit be5b8bc9e69b97b957ee9a1fd3ef8fa8e85d0ddf) IJ-CR-165004 GitOrigin-RevId: b3182bb3682141e81775306130f540af449dd5e3 --- .../intellij/diagnostic/logging/LogConsoleBase.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/platform/execution-impl/src/com/intellij/diagnostic/logging/LogConsoleBase.java b/platform/execution-impl/src/com/intellij/diagnostic/logging/LogConsoleBase.java index 196072eac231..a753fe18d7c4 100644 --- a/platform/execution-impl/src/com/intellij/diagnostic/logging/LogConsoleBase.java +++ b/platform/execution-impl/src/com/intellij/diagnostic/logging/LogConsoleBase.java @@ -19,6 +19,7 @@ import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.CustomComponentAction; import com.intellij.openapi.actionSystem.impl.ActionButton; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.WriteIntentReadAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; @@ -45,6 +46,7 @@ import com.intellij.ui.components.panels.NonOpaquePanel; import com.intellij.util.Alarm; import com.intellij.util.ArrayUtilRt; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.ui.EDT; import com.intellij.util.ui.JBEmptyBorder; import com.intellij.util.ui.accessibility.AccessibleContextUtil; import com.intellij.util.ui.accessibility.ScreenReader; @@ -439,7 +441,14 @@ public abstract class LogConsoleBase extends AdditionalTabComponent implements L @Override public void processTerminated(final @NotNull ProcessEvent event) { process.removeProcessListener(this); - WriteIntentReadAction.run((Runnable)() ->stopRunning(true)); + if (EDT.isCurrentThreadEdt()) { + WriteIntentReadAction.run((Runnable)() -> stopRunning(true)); + } + else { + ApplicationManager.getApplication().invokeAndWait(() -> { + stopRunning(true); + }, ModalityState.any()); + } } }; process.addProcessListener(stopListener);