From 43a1bf9510d11261d1bbf6c55deb7e4d00b2c93a Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Sat, 29 Aug 2009 00:22:42 +0400 Subject: [PATCH] restore irina's lost changes --- .../lifecycle/PeriodicalTasksCloser.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/platform/vcs-impl/src/com/intellij/lifecycle/PeriodicalTasksCloser.java b/platform/vcs-impl/src/com/intellij/lifecycle/PeriodicalTasksCloser.java index 5540c421c3ad..8cf831cf42d2 100644 --- a/platform/vcs-impl/src/com/intellij/lifecycle/PeriodicalTasksCloser.java +++ b/platform/vcs-impl/src/com/intellij/lifecycle/PeriodicalTasksCloser.java @@ -1,5 +1,9 @@ package com.intellij.lifecycle; +import com.intellij.openapi.application.Application; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ModalityState; +import com.intellij.openapi.application.impl.LaterInvocator; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProcessCanceledException; @@ -8,7 +12,11 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.project.ProjectManagerListener; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.Ref; +import com.intellij.util.concurrency.Semaphore; +import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -92,4 +100,54 @@ public class PeriodicalTasksCloser implements ProjectManagerListener { return component; } } + + public static void invokeAndWaitInterruptedWhenClosing(final Project project, final Runnable runnable, final ModalityState modalityState) { + final Ref start = new Ref(Boolean.TRUE); + final Application application = ApplicationManager.getApplication(); + LOG.assertTrue(! application.isDispatchThread()); + + final Semaphore semaphore = new Semaphore(); + semaphore.down(); + Runnable runnable1 = new Runnable() { + public void run() { + try { + runnable.run(); + } + finally { + semaphore.up(); + } + } + + @NonNls + public String toString() { + return "PeriodicalTaskCloser's invoke and wait [" + runnable.toString() + "]"; + } + }; + LaterInvocator.invokeLater(runnable1, modalityState, new Condition() { + public boolean value(Object o) { + synchronized (start) { + return ! start.get(); + } + } + }); + + while (true) { + if (semaphore.waitFor(1000)) { + return; + } + final Ref fire = new Ref(); + synchronized (ourLock) { + final Boolean state = myStates.get(project); + if (! Boolean.TRUE.equals(state)) { + fire.set(Boolean.TRUE); + } + if (Boolean.TRUE.equals(fire.get())) { + synchronized (start) { + start.set(Boolean.FALSE); + return; + } + } + } + } + } }