diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/LaterInvocator.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/LaterInvocator.java index 140ffcba15f1..4de7628f1e76 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/LaterInvocator.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/LaterInvocator.java @@ -89,7 +89,7 @@ public class LaterInvocator { private static final Stack ourModalityStack = new Stack<>(ModalityState.NON_MODAL); private static final List ourQueue = new ArrayList<>(); //protected by LOCK - private static volatile int ourQueueSkipCount; // optimization + private static volatile int ourQueueSkipCount; // optimization: should look for next events starting from this index private static final FlushQueue ourFlushQueueRunnable = new FlushQueue(); private static final EventDispatcher ourModalityStateMulticaster = EventDispatcher.create(ModalityStateListener.class); @@ -142,6 +142,7 @@ public class LaterInvocator { @NotNull static ActionCallback invokeLater(@NotNull Runnable runnable, @NotNull ModalityState modalityState, @NotNull Condition expired) { + if (expired.value(null)) return ActionCallback.REJECTED; final ActionCallback callback = new ActionCallback(); RunnableInfo runnableInfo = new RunnableInfo(runnable, modalityState, expired, callback); synchronized (LOCK) { @@ -432,4 +433,21 @@ public class LaterInvocator { return ContainerUtil.newArrayList(ourQueue); } } + + public static void purgeExpiredItems() { + synchronized (LOCK) { + boolean removed = false; + for (int i = ourQueue.size() - 1; i >= 0; i--) { + RunnableInfo info = ourQueue.get(i); + if (info.expired.value(null)) { + ourQueue.remove(i); + info.callback.setDone(); + removed = true; + } + } + if (removed) { + ourQueueSkipCount = 0; + } + } + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java index 794aa3b39b1e..d2cd16b6aca7 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java @@ -28,6 +28,7 @@ import com.intellij.notification.NotificationType; import com.intellij.notification.NotificationsManager; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.*; +import com.intellij.openapi.application.impl.LaterInvocator; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.progress.ProcessCanceledException; @@ -102,6 +103,7 @@ public class ProjectManagerImpl extends ProjectManagerEx implements Disposable { listener.projectClosed(project); } ZipHandler.clearFileAccessorCache(); + LaterInvocator.purgeExpiredItems(); } @Override