From a20f0e0aeefd85c1865d57fa876ae94f9cd1a108 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 23 May 2016 09:38:41 +0200 Subject: [PATCH] ensure that all transaction-related invokeLater-s are executed, even after application is disposed (on shutdown hook) --- .../application/TransactionGuardImpl.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/platform/core-impl/src/com/intellij/openapi/application/TransactionGuardImpl.java b/platform/core-impl/src/com/intellij/openapi/application/TransactionGuardImpl.java index ad78e6c8fa15..b0bd3cf351db 100644 --- a/platform/core-impl/src/com/intellij/openapi/application/TransactionGuardImpl.java +++ b/platform/core-impl/src/com/intellij/openapi/application/TransactionGuardImpl.java @@ -21,6 +21,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressIndicatorProvider; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.registry.Registry; import com.intellij.util.concurrency.Semaphore; @@ -62,7 +63,7 @@ public class TransactionGuardImpl extends TransactionGuard { } private void pollQueueLater() { - ApplicationManager.getApplication().invokeLater(new Runnable() { + invokeLater(new Runnable() { @Override public void run() { Queue queue = getQueue(myCurrentTransaction); @@ -72,7 +73,7 @@ public class TransactionGuardImpl extends TransactionGuard { runSyncTransaction(next); } } - }, ModalityState.any()); + }); } private void runSyncTransaction(@NotNull Transaction transaction) { @@ -121,7 +122,7 @@ public class TransactionGuardImpl extends TransactionGuard { if (isDispatchThread) { runnable.run(); } else { - app.invokeLater(runnable, ModalityState.any()); + invokeLater(runnable); } } @@ -241,13 +242,17 @@ public class TransactionGuardImpl extends TransactionGuard { @Override public void submitTransactionLater(@NotNull final Disposable parentDisposable, @NotNull final Runnable transaction) { final TransactionIdImpl id = getContextTransaction(); - Application app = ApplicationManager.getApplication(); - app.invokeLater(new Runnable() { + Runnable runnable = new Runnable() { @Override public void run() { submitTransaction(parentDisposable, id, transaction); } - }, ModalityState.any()); + }; + invokeLater(runnable); + } + + private static void invokeLater(Runnable runnable) { + ApplicationManager.getApplication().invokeLater(runnable, ModalityState.any(), Condition.FALSE); } @Override