From 2d9958ab643e5a69f150d1757ccb9840b90b8d4d Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Wed, 30 Sep 2015 16:45:38 +0300 Subject: [PATCH] IDEA-43728 Provide a way to step in a chosen thread while others remain suspended --- .../com/intellij/debugger/engine/DebugProcessImpl.java | 10 ++++++---- .../com/intellij/debugger/engine/JavaDebugProcess.java | 5 +---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java index 8aa12846c066..79d348bddeca 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java @@ -414,8 +414,9 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb // suspend policy to match the suspend policy of the context: // if all threads were suspended, then during stepping all the threads must be suspended // if only event thread were suspended, then only this particular thread must be suspended during stepping - stepRequest.setSuspendPolicy(Registry.is("debugger.step.resumes.one.thread") ? EventRequest.SUSPEND_EVENT_THREAD - : suspendContext.getSuspendPolicy()); + stepRequest.setSuspendPolicy(suspendContext.getSuspendPolicy() == EventRequest.SUSPEND_EVENT_THREAD + ? EventRequest.SUSPEND_EVENT_THREAD + : EventRequest.SUSPEND_ALL); if (hint != null) { //noinspection HardCodedStringLiteral @@ -1648,7 +1649,8 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb @Override protected void resumeAction() { SuspendContextImpl context = getSuspendContext(); - if (context != null && context.getSuspendPolicy() == EventRequest.SUSPEND_EVENT_THREAD) { + if (context != null && + (context.getSuspendPolicy() == EventRequest.SUSPEND_EVENT_THREAD || Registry.is("debugger.step.resumes.one.thread"))) { myThreadBlockedMonitor.startWatching(myContextThread); } if (context != null @@ -1740,7 +1742,7 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb final Set suspendingContexts = SuspendManagerUtil.getSuspendingContexts(getSuspendManager(), myThread); for (SuspendContextImpl suspendContext : suspendingContexts) { - if (suspendContext.getThread() == myThread) { + if (suspendContext.getSuspendPolicy() == EventRequest.SUSPEND_EVENT_THREAD && suspendContext.getThread() == myThread) { getSession().getXDebugSession().sessionResumed(); getManagerThread().invoke(createResumeCommand(suspendContext)); } 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 4875a0f214e2..c1c93fc4d669 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaDebugProcess.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaDebugProcess.java @@ -58,7 +58,6 @@ import com.intellij.xdebugger.impl.XDebugSessionImpl; import com.intellij.xdebugger.impl.XDebuggerUtilImpl; import com.intellij.xdebugger.ui.XDebugTabLayouter; import com.sun.jdi.event.Event; -import com.sun.jdi.request.EventRequest; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.java.debugger.JavaDebuggerEditorsProvider; @@ -187,9 +186,7 @@ public class JavaDebugProcess extends XDebugProcess { private void unsetPausedIfNeeded(DebuggerContextImpl context) { SuspendContextImpl suspendContext = context.getSuspendContext(); - if (suspendContext != null - && suspendContext.getSuspendPolicy() == EventRequest.SUSPEND_EVENT_THREAD - && context.getThreadProxy() != suspendContext.getThread()) { + if (suspendContext != null && !suspendContext.suspends(context.getThreadProxy())) { ((XDebugSessionImpl)getSession()).unsetPaused(); } }