do not discard step request in a particular thread when stepping in another thread occurs (IDEA-63007)

This commit is contained in:
Eugene Zhuravlev
2010-12-15 18:52:49 +03:00
parent 8ac9dcc94d
commit af732e3019
3 changed files with 9 additions and 7 deletions
@@ -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;
@@ -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<ClassFilter> activeFilters = new ArrayList<ClassFilter>();
@@ -404,7 +405,7 @@ public abstract class DebugProcessImpl implements DebugProcess {
}
}
void deleteStepRequests() {
void deleteStepRequests(@Nullable final ThreadReference stepThread) {
EventRequestManager requestManager = getVirtualMachineProxy().eventRequestManager();
List<StepRequest> 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);
}
}
@@ -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);
}
}