separate waitUntilFinished from invokeAfterUpdate logic in vcs update
authorpeter <peter@jetbrains.com>
Mon, 16 Jan 2012 18:23:44 +0000 (19:23 +0100)
committerpeter <peter@jetbrains.com>
Mon, 16 Jan 2012 18:26:41 +0000 (19:26 +0100)
platform/vcs-impl/src/com/intellij/openapi/vcs/changes/UpdateRequestsQueue.java

index b7adf26927d668f1c6c04519c2047c6fd30a220f..16da589db02e989878697a7286b2b0fad9b642df 100644 (file)
@@ -54,6 +54,7 @@ public class UpdateRequestsQueue {
   private boolean myRequestSubmitted;
   private boolean myRequestRunning;
   private final List<Runnable> myWaitingUpdateCompletionQueue;
+  private final List<Semaphore> myWaitingUpdateCompletionSemaphores = new ArrayList<Semaphore>();
   private final ProjectLevelVcsManager myPlVcsManager;
   //private final ScheduledSlowlyClosingAlarm mySharedExecutor;
   private final StartupManager myStartupManager;
@@ -149,31 +150,18 @@ public class UpdateRequestsQueue {
     try {
       while (true) {
         final Semaphore semaphore = new Semaphore();
-        semaphore.down();
         synchronized (myLock) {
-          final Runnable runnable = new Runnable() {
-            @Override
-            public void run() {
-              semaphore.up();
-            }
-          };
-          if (myRequestSubmitted || myRequestRunning) {
-            myWaitingUpdateCompletionQueue.add(runnable);
-          }
-          else {
-            runnable.run();
+          if (!myRequestSubmitted && !myRequestRunning) {
+            return;
           }
+
+          semaphore.down();
+          myWaitingUpdateCompletionSemaphores.add(semaphore);
         }
         if (!semaphore.waitFor(10000)) {
           LOG.error("Too long VCS update");
           return;
         }
-
-        synchronized (myLock) {
-          if (!myRequestSubmitted && !myRequestRunning) {
-            return;
-          }
-        }
       }
     }
     finally {
@@ -183,6 +171,15 @@ public class UpdateRequestsQueue {
     }
   }
 
+  private void freeSemaphores() {
+    synchronized (myLock) {
+      for (Semaphore semaphore : myWaitingUpdateCompletionSemaphores) {
+        semaphore.up();
+      }
+      myWaitingUpdateCompletionSemaphores.clear();
+    }
+  }
+
   public void invokeAfterUpdate(final Runnable afterUpdate, final InvokeAfterUpdateMode mode, final String title,
                                 final Consumer<VcsDirtyScopeManager> dirtyScopeManagerFiller, final ModalityState state) {
     LOG.debug("invokeAfterUpdate for project: " + myProject.getName());
@@ -285,6 +282,7 @@ public class UpdateRequestsQueue {
         for (Runnable runnable : copy) {
           runnable.run();
         }
+        freeSemaphores();
         LOG.debug("MyRunnable: Runnables executed, project: " + myProject.getName() + ", runnable: " + hashCode());
       }
     }