diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/ResumeAllJavaThreadsActionHandler.kt b/java/debugger/impl/src/com/intellij/debugger/actions/ResumeAllJavaThreadsActionHandler.kt new file mode 100644 index 000000000000..c93bd02db8a9 --- /dev/null +++ b/java/debugger/impl/src/com/intellij/debugger/actions/ResumeAllJavaThreadsActionHandler.kt @@ -0,0 +1,34 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.debugger.actions + +import com.intellij.debugger.engine.DebugProcessImpl +import com.intellij.debugger.engine.SuspendContextImpl +import com.intellij.debugger.engine.events.DebuggerCommandImpl +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.project.Project +import com.intellij.xdebugger.impl.actions.DebuggerActionHandler +import com.intellij.xdebugger.impl.ui.DebuggerUIUtil + +class ResumeAllJavaThreadsActionHandler(val debugProcess: DebugProcessImpl) : DebuggerActionHandler() { + override fun perform(project: Project, event: AnActionEvent) { + val xdebugProcess = debugProcess.xdebugProcess ?: return + + debugProcess.managerThread.schedule(object : DebuggerCommandImpl() { + override fun action() { + val contexts: MutableList = debugProcess.suspendManager.pausedContexts + for (context in contexts) { + if (!context.isResumed) { + debugProcess.suspendManager.resume(context) + } + } + DebuggerUIUtil.invokeLater(Runnable { + xdebugProcess.session.resume() + }) + } + }) + } + + override fun isEnabled(project: Project, event: AnActionEvent): Boolean { + return !debugProcess.suspendManager.pausedContexts.isEmpty() + } +} \ No newline at end of file diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaDebugProcess.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaDebugProcess.java index 3bf12bc02f09..969d03367f12 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaDebugProcess.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaDebugProcess.java @@ -4,6 +4,7 @@ package com.intellij.debugger.engine; import com.intellij.debugger.JavaDebuggerBundle; import com.intellij.debugger.actions.JvmDropFrameActionHandler; import com.intellij.debugger.actions.JvmSmartStepIntoActionHandler; +import com.intellij.debugger.actions.ResumeAllJavaThreadsActionHandler; import com.intellij.debugger.engine.dfaassist.DfaAssist; import com.intellij.debugger.engine.evaluation.EvaluationContext; import com.intellij.debugger.engine.events.DebuggerCommandImpl; @@ -51,8 +52,10 @@ import com.intellij.xdebugger.frame.XDropFrameHandler; import com.intellij.xdebugger.frame.XStackFrame; import com.intellij.xdebugger.frame.XSuspendContext; import com.intellij.xdebugger.frame.XValueMarkerProvider; +import com.intellij.xdebugger.impl.ThreadsActionsProvider; import com.intellij.xdebugger.impl.XDebugSessionImpl; import com.intellij.xdebugger.impl.XDebuggerUtilImpl; +import com.intellij.xdebugger.impl.actions.DebuggerActionHandler; import com.intellij.xdebugger.impl.ui.DebuggerUIUtil; import com.intellij.xdebugger.memory.component.InstancesTracker; import com.intellij.xdebugger.memory.component.MemoryViewManager; @@ -84,7 +87,7 @@ public class JavaDebugProcess extends XDebugProcess { }; public static JavaDebugProcess create(final @NotNull XDebugSession session, final @NotNull DebuggerSession javaSession) { - JavaDebugProcess res = new JavaDebugProcess(session, javaSession); + JavaDebugProcess res = new JavaDebugProcessWithThreadsActions(session, javaSession); javaSession.getProcess().setXDebugProcess(res); return res; } @@ -545,4 +548,18 @@ public class JavaDebugProcess extends XDebugProcess { public @Nullable XDropFrameHandler getDropFrameHandler() { return myDropFrameActionActionHandler; } + + private static final class JavaDebugProcessWithThreadsActions extends JavaDebugProcess implements ThreadsActionsProvider { + private JavaDebugProcessWithThreadsActions(@NotNull XDebugSession session, @NotNull DebuggerSession javaSession) { + super(session, javaSession); + myResumeAllJavaThreadsActionHandler = new ResumeAllJavaThreadsActionHandler(getDebuggerSession().getProcess()); + } + + private final ResumeAllJavaThreadsActionHandler myResumeAllJavaThreadsActionHandler; + + @Override + public @Nullable DebuggerActionHandler getThawAllThreadsHandler() { + return myResumeAllJavaThreadsActionHandler; + } + } }