From af732e301997989f9d980f96c36185f71e227ee9 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Wed, 15 Dec 2010 18:32:12 +0300 Subject: [PATCH] do not discard step request in a particular thread when stepping in another thread occurs (IDEA-63007) --- .../intellij/debugger/engine/DebugProcessEvents.java | 2 +- .../intellij/debugger/engine/DebugProcessImpl.java | 11 ++++++----- .../intellij/debugger/engine/SuspendManagerImpl.java | 3 ++- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java index 5d12ced33651..efff8ab5787a 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java @@ -351,7 +351,7 @@ public class DebugProcessEvents extends DebugProcessImpl { //noinspection HardCodedStringLiteral RequestHint hint = (RequestHint)event.request().getProperty("hint"); - deleteStepRequests(); + deleteStepRequests(event.thread()); boolean shouldResume = false; 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 0e907ad96f1f..c88999862fdc 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java @@ -353,12 +353,13 @@ public abstract class DebugProcessImpl implements DebugProcess { return; } try { + final ThreadReference stepThreadReference = stepThread.getThreadReference(); if (LOG.isDebugEnabled()) { - LOG.debug("DO_STEP: creating step request for " + stepThread.getThreadReference()); + LOG.debug("DO_STEP: creating step request for " + stepThreadReference); } - deleteStepRequests(); + deleteStepRequests(stepThreadReference); EventRequestManager requestManager = getVirtualMachineProxy().eventRequestManager(); - StepRequest stepRequest = requestManager.createStepRequest(stepThread.getThreadReference(), StepRequest.STEP_LINE, depth); + StepRequest stepRequest = requestManager.createStepRequest(stepThreadReference, StepRequest.STEP_LINE, depth); DebuggerSettings settings = DebuggerSettings.getInstance(); if (!(hint != null && hint.isIgnoreFilters()) /*&& depth == StepRequest.STEP_INTO*/) { final List activeFilters = new ArrayList(); @@ -404,7 +405,7 @@ public abstract class DebugProcessImpl implements DebugProcess { } } - void deleteStepRequests() { + void deleteStepRequests(@Nullable final ThreadReference stepThread) { EventRequestManager requestManager = getVirtualMachineProxy().eventRequestManager(); List stepRequests = requestManager.stepRequests(); if (stepRequests.size() > 0) { @@ -412,7 +413,7 @@ public abstract class DebugProcessImpl implements DebugProcess { for (final StepRequest request : stepRequests) { ThreadReference threadReference = request.thread(); // [jeka] on attempt to delete a request assigned to a thread with unknown status, a JDWP error occures - if (threadReference.status() != ThreadReference.THREAD_STATUS_UNKNOWN) { + if (threadReference.status() != ThreadReference.THREAD_STATUS_UNKNOWN && (stepThread == null || stepThread.equals(threadReference))) { toDelete.add(request); } } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/SuspendManagerImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/SuspendManagerImpl.java index 07bed88ea199..110d70270f5d 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/SuspendManagerImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/SuspendManagerImpl.java @@ -298,7 +298,8 @@ public class SuspendManagerImpl implements SuspendManager { } myDebugProcess.logThreads(); myDebugProcess.cancelRunToCursorBreakpoint(); - myDebugProcess.deleteStepRequests(); + final ThreadReferenceProxyImpl thread = suspendContext.getThread(); + myDebugProcess.deleteStepRequests(thread != null? thread.getThreadReference() : null); notifyPaused(suspendContext); } }