From 134a1db80e0637ee75d60b9003eb6a2f830685db Mon Sep 17 00:00:00 2001 From: Kiryl Chetyrbak Date: Wed, 26 Apr 2017 17:07:14 +0300 Subject: [PATCH] Fix race Condition in UpdateRequestsQueue Stopped can be switched into not stopped now. --- .../vcs/changes/UpdateRequestsQueue.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/UpdateRequestsQueue.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/UpdateRequestsQueue.java index 25c51027dbda..aeca4ea334ca 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/UpdateRequestsQueue.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/UpdateRequestsQueue.java @@ -31,7 +31,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; -import javax.swing.*; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Future; @@ -39,6 +38,8 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; +import static com.intellij.util.ObjectUtils.notNull; + /** * ChangeListManager updates scheduler. * Tries to zip several update requests into one (if starts and see several requests in the queue) @@ -204,22 +205,21 @@ public class UpdateRequestsQueue { } } + boolean stopped; synchronized (myLock) { - if (! myStopped) { + stopped = myStopped; + if (!stopped) { myWaitingUpdateCompletionQueue.add(data.getCallback()); schedule(); } } - // do not run under lock; stopped cannot be switched into not stopped - can check without lock - if (myStopped) { + if (stopped) { LOG.debug("invokeAfterUpdate: stopped, invoke right now for project: " + myProject.getName()); - SwingUtilities.invokeLater(new Runnable() { - public void run() { - if (!myProject.isDisposed()) { - afterUpdate.run(); - } + ApplicationManager.getApplication().invokeLater(() -> { + if (!myProject.isDisposed()) { + afterUpdate.run(); } - }); + }, notNull(state, ModalityState.defaultModalityState())); return; } // invoke progress if needed