[debugger] fixing flaky tests

GitOrigin-RevId: 6325d5f32e460156ad8fa4ab31275233a69903e5
This commit is contained in:
Egor Ushakov
2025-03-04 16:47:36 +00:00
committed by intellij-monorepo-bot
parent 7cb63072b1
commit b07924624e
2 changed files with 26 additions and 16 deletions
@@ -166,9 +166,10 @@ class DebuggerManagerThreadImpl @ApiStatus.Internal @JvmOverloads constructor(
{
if (currentCommand === myEvents.currentEvent) {
// if current command is still in progress, cancel it
currentRequest.requestStop()
val request = currentRequest
request.requestStop()
try {
currentRequest.join()
request.join()
}
catch (_: InterruptedException) {
}
@@ -118,7 +118,7 @@ public abstract class InvokeThread<E extends PrioritizedTask> {
protected final EventQueue<E> myEvents;
private volatile WorkerThreadRequest<E> myCurrentRequest = null;
private WorkerThreadRequest<E> myCurrentRequest = null;
public InvokeThread() {
myEvents = new EventQueue<>(PrioritizedTask.Priority.values().length);
@@ -128,15 +128,19 @@ public abstract class InvokeThread<E extends PrioritizedTask> {
protected abstract void processEvent(@NotNull E e);
protected void startNewWorkerThread() {
assertCurrentThreadIsActive();
// myCurrentRequest has to be updated atomically with calling setRequestFuture
// otherwise we may have asserts triggering inside workerRequest.requestStop etc.
synchronized (this) {
assertCurrentThreadIsActive();
final WorkerThreadRequest<E> workerRequest = new WorkerThreadRequest<>(this);
WorkerThreadRequest<E> oldRequest = myCurrentRequest; // just for logging
myCurrentRequest = workerRequest;
if (LOG.isDebugEnabled()) {
LOG.debug("Started new worker thread request " + workerRequest + ", was " + oldRequest);
final WorkerThreadRequest<E> workerRequest = new WorkerThreadRequest<>(this);
WorkerThreadRequest<E> oldRequest = myCurrentRequest; // just for logging
myCurrentRequest = workerRequest;
if (LOG.isDebugEnabled()) {
LOG.debug("Started new worker thread request " + workerRequest + ", was " + oldRequest);
}
workerRequest.setRequestFuture(ApplicationManager.getApplication().executeOnPooledThread(workerRequest));
}
workerRequest.setRequestFuture(ApplicationManager.getApplication().executeOnPooledThread(workerRequest));
}
protected static boolean assertCurrentThreadIsActive() {
@@ -258,18 +262,23 @@ public abstract class InvokeThread<E extends PrioritizedTask> {
}
protected void switchToRequest(WorkerThreadRequest newRequest) {
final WorkerThreadRequest currentThreadRequest = getCurrentThreadRequest();
LOG.assertTrue(currentThreadRequest != null);
myCurrentRequest = newRequest;
if (LOG.isDebugEnabled()) {
LOG.debug("Switched current request from " + currentThreadRequest + " to " + newRequest);
WorkerThreadRequest currentThreadRequest;
synchronized (this) {
currentThreadRequest = getCurrentThreadRequest();
LOG.assertTrue(currentThreadRequest != null);
myCurrentRequest = newRequest;
if (LOG.isDebugEnabled()) {
LOG.debug("Switched current request from " + currentThreadRequest + " to " + newRequest);
}
}
currentThreadRequest.requestStop();
}
public WorkerThreadRequest<E> getCurrentRequest() {
return myCurrentRequest;
synchronized (this) {
return myCurrentRequest;
}
}
public static WorkerThreadRequest<?> getCurrentThreadRequest() {