diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/VcsInitialization.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/VcsInitialization.java index 2705f6d60d0f..7af934338ec6 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/VcsInitialization.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/VcsInitialization.java @@ -15,6 +15,8 @@ */ package com.intellij.openapi.vcs.impl; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.DumbAwareRunnable; import com.intellij.openapi.project.Project; import com.intellij.openapi.startup.StartupManager; @@ -26,10 +28,15 @@ import java.util.LinkedList; import java.util.List; public class VcsInitialization { + private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.vcs.impl.VcsInitialization"); + private final Project myProject; private final List> myList; + private final Object myLock; + private boolean myInitStarted; - public VcsInitialization(Project project) { + public VcsInitialization(final Project project) { + myLock = new Object(); myProject = project; myList = new LinkedList>(); @@ -41,16 +48,28 @@ public class VcsInitialization { } public void add(final VcsInitObject vcsInitObject, final Runnable runnable) { - myList.add(new Pair(vcsInitObject, runnable)); + synchronized (myLock) { + if (myInitStarted) { + LOG.info("Registering startup activity AFTER initialization ", new Throwable()); + // post startup are normally called on awt thread + ApplicationManager.getApplication().invokeLater(runnable); + } + myList.add(new Pair(vcsInitObject, runnable)); + } } public void execute() { - Collections.sort(myList, new Comparator>() { + final List> list; + synchronized (myLock) { + list = myList; + myInitStarted = true; // list would not be modified starting from this point + } + Collections.sort(list, new Comparator>() { public int compare(Pair o1, Pair o2) { return new Integer(o1.getFirst().getOrder()).compareTo(new Integer(o2.getFirst().getOrder())); } }); - for (Pair pair : myList) { + for (Pair pair : list) { pair.getSecond().run(); } }