From ce42137fcd93bef2eb852b904e231ca574a6ea8f Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Apr 2015 14:56:14 +0200 Subject: [PATCH] LaterInvocator: when leaving a modal state, run all the associated runnables --- .../openapi/application/impl/LaterInvocator.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) 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 f58965e756d4..01f075b040a4 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 @@ -83,7 +83,7 @@ public class LaterInvocator { private static final List ourModalEntities = ContainerUtil.createLockFreeCopyOnWriteList(); private static final List ourQueue = new ArrayList(); //protected by LOCK private static volatile int ourQueueSkipCount = 0; // optimization - private static final Runnable ourFlushQueueRunnable = new FlushQueue(); + private static final FlushQueue ourFlushQueueRunnable = new FlushQueue(); private static final Stack ourEventStack = new Stack(); // guarded by RUN_LOCK @@ -189,6 +189,9 @@ public class LaterInvocator { LOG.debug("leaveModal:" + modalEntity); } + //noinspection StatementWithEmptyBody + while (ourFlushQueueRunnable.runNextEvent()); + ourModalityStateMulticaster.getMulticaster().beforeModalityStateChanged(false); boolean removed = ourModalEntities.remove(modalEntity); @@ -308,12 +311,17 @@ public class LaterInvocator { private static final Object RUN_LOCK = new Object(); private static class FlushQueue implements Runnable { - private RunnableInfo myLastInfo; + @SuppressWarnings("FieldAccessedSynchronizedAndUnsynchronized") private RunnableInfo myLastInfo; @Override public void run() { FLUSHER_SCHEDULED.set(false); + if (runNextEvent()) { + requestFlush(); + } + } + private boolean runNextEvent() { final RunnableInfo lastInfo = getNextEvent(true); myLastInfo = lastInfo; @@ -338,9 +346,8 @@ public class LaterInvocator { if (!DEBUG) myLastInfo = null; } } - - requestFlush(); } + return lastInfo != null; } @Override