From 9e5909a85417fac7f7926bea26586d780dc3ce99 Mon Sep 17 00:00:00 2001 From: Alexey Merkulov Date: Tue, 4 Jun 2024 18:31:18 +0200 Subject: [PATCH] [debugger] Hide thread model counter handling from public API GitOrigin-RevId: 56eee01ed400e242f431b7dcd004d7622ca5063f --- .../debugger/engine/DebugProcessEvents.java | 2 +- .../debugger/engine/SuspendManagerImpl.java | 2 +- .../engine/evaluation/EvaluationContextImpl.java | 2 -- .../debugger/jdi/ThreadReferenceProxyImpl.java | 15 +++++++++++++-- 4 files changed, 15 insertions(+), 6 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 2076ff1410fd..34ce8a1a6564 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java @@ -338,7 +338,7 @@ public class DebugProcessEvents extends DebugProcessImpl { if (oldThread == null) { switch (suspendContext.getSuspendPolicy()) { case EventRequest.SUSPEND_ALL -> suspendContext.getDebugProcess().getVirtualMachineProxy().addedSuspendAllContext(); - case EventRequest.SUSPEND_EVENT_THREAD -> Objects.requireNonNull(suspendContext.getEventThread()).suspendedThreadContext(); + case EventRequest.SUSPEND_EVENT_THREAD -> Objects.requireNonNull(suspendContext.getEventThread()).threadWasSuspended(); } //this is the first event in the eventSet that we process suspendContext.getDebugProcess().beforeSuspend(suspendContext); 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 05c353cc2c5c..69ea1dfb7f3d 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/SuspendManagerImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/SuspendManagerImpl.java @@ -96,7 +96,7 @@ public class SuspendManagerImpl implements SuspendManager { myDebugProcess.logThreads(); switch (getSuspendPolicy()) { case EventRequest.SUSPEND_ALL -> myDebugProcess.getVirtualMachineProxy().resumedSuspendAllContext(); - case EventRequest.SUSPEND_EVENT_THREAD -> Objects.requireNonNull(getEventThread()).resumedSuspendThreadContext(); + case EventRequest.SUSPEND_EVENT_THREAD -> Objects.requireNonNull(getEventThread()).threadWasResumed(); } DebuggerUtilsAsync.resume(set); LOG.debug("Set resumed "); diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/EvaluationContextImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/EvaluationContextImpl.java index 4266838223ca..d75fa5b1c521 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/EvaluationContextImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/EvaluationContextImpl.java @@ -123,7 +123,6 @@ public final class EvaluationContextImpl implements EvaluationContext { assert myThreadForEvaluation == null; assert !mySuspendContext.isEvaluating(); assert !threadForEvaluation.isEvaluating(); - threadForEvaluation.resumedSuspendThreadContext(); threadForEvaluation.setEvaluating(true); mySuspendContext.setIsEvaluating(this); } @@ -131,7 +130,6 @@ public final class EvaluationContextImpl implements EvaluationContext { assert myThreadForEvaluation != null; assert myThreadForEvaluation.isEvaluating(); assert mySuspendContext.getEvaluationContext() == this; - myThreadForEvaluation.suspendedThreadContext(); mySuspendContext.setIsEvaluating(null); myThreadForEvaluation.setEvaluating(false); } diff --git a/java/debugger/impl/src/com/intellij/debugger/jdi/ThreadReferenceProxyImpl.java b/java/debugger/impl/src/com/intellij/debugger/jdi/ThreadReferenceProxyImpl.java index a36c2da8e445..0587e9166e0f 100644 --- a/java/debugger/impl/src/com/intellij/debugger/jdi/ThreadReferenceProxyImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/jdi/ThreadReferenceProxyImpl.java @@ -46,6 +46,7 @@ public final class ThreadReferenceProxyImpl extends ObjectReferenceProxyImpl imp private volatile boolean myIsEvaluating = false; + // This counter can go negative value if the engine stops the whole JVM, but resumed this particular thread public int myModelSuspendCount = 0; public static final Comparator ourComparator = (th1, th2) -> { @@ -113,6 +114,7 @@ public final class ThreadReferenceProxyImpl extends ObjectReferenceProxyImpl imp myListeners.getMulticaster().threadSuspended(); } + @ApiStatus.Internal public void suspendImpl() { myModelSuspendCount++; getThreadReference().suspend(); @@ -140,6 +142,7 @@ public final class ThreadReferenceProxyImpl extends ObjectReferenceProxyImpl imp myListeners.getMulticaster().threadResumed(); } + @ApiStatus.Internal public void resumeImpl() { myModelSuspendCount--; DebuggerUtilsAsync.resume(getThreadReference()); @@ -466,11 +469,13 @@ public final class ThreadReferenceProxyImpl extends ObjectReferenceProxyImpl imp return myModelSuspendCount + getVirtualMachine().getModelSuspendCount(); } - public void suspendedThreadContext() { + @ApiStatus.Internal + public void threadWasSuspended() { myModelSuspendCount++; } - public void resumedSuspendThreadContext() { + @ApiStatus.Internal + public void threadWasResumed() { myModelSuspendCount--; } @@ -491,6 +496,12 @@ public final class ThreadReferenceProxyImpl extends ObjectReferenceProxyImpl imp @ApiStatus.Internal public void setEvaluating(boolean evaluating) { myIsEvaluating = evaluating; + if (evaluating) { + threadWasResumed(); + } + else { + threadWasSuspended(); + } } public interface ThreadListener extends EventListener{