diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java index 86c290934d02..310ac4f80f27 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java @@ -95,7 +95,7 @@ public class ProjectManagerImpl extends ProjectManagerEx implements NamedJDOMExt private final Map mySavedCopies = new HashMap(); private final TObjectLongHashMap mySavedTimestamps = new TObjectLongHashMap(); - private final HashMap>> myChangedProjectFiles = new HashMap>>(); + private final Map>> myChangedProjectFiles = new HashMap>>(); private final Alarm myChangedFilesAlarm = new Alarm(); private final List> myChangedApplicationFiles = new ArrayList>(); private volatile int myReloadBlockCount = 0; @@ -574,8 +574,17 @@ public class ProjectManagerImpl extends ProjectManagerEx implements NamedJDOMExt } private void askToReloadProjectIfConfigFilesChangedExternally() { - if (!myChangedProjectFiles.isEmpty() && myReloadBlockCount == 0) { - Set projects = myChangedProjectFiles.keySet(); + LOG.info("[STORAGE] trying to reload project while myReloadBlockCount = " + myReloadBlockCount); + if (myReloadBlockCount == 0) { + Set projects; + + synchronized (myChangedProjectFiles) { + if (myChangedProjectFiles.isEmpty()) return; + projects = new HashSet(myChangedProjectFiles.keySet()); + } + + LOG.info("[STORAGE] iterate over opened project & reload"); + List projectsToReload = new ArrayList(); for (Project project : projects) { @@ -587,8 +596,6 @@ public class ProjectManagerImpl extends ProjectManagerEx implements NamedJDOMExt for (final Project projectToReload : projectsToReload) { reloadProjectImpl(projectToReload, false, false); } - - myChangedProjectFiles.clear(); } } @@ -651,7 +658,18 @@ public class ProjectManagerImpl extends ProjectManagerEx implements NamedJDOMExt private boolean shouldReloadProject(final Project project) { if (project.isDisposed()) return false; - final HashSet> causes = new HashSet>(myChangedProjectFiles.get(project)); + final HashSet> causes = new HashSet>(); + + LOG.info("[STORAGE] Should reload project now"); + + synchronized (myChangedProjectFiles) { + final List> changes = myChangedProjectFiles.remove(project); + if (changes != null) { + causes.addAll(changes); + } + + if (causes.isEmpty()) return false; + } final boolean[] reloadOk = {false}; @@ -707,14 +725,17 @@ public class ProjectManagerImpl extends ProjectManagerEx implements NamedJDOMExt } public void unblockReloadingProjectOnExternalChanges() { - myReloadBlockCount--; - scheduleReloadApplicationAndProject(); + if (--myReloadBlockCount == 0) scheduleReloadApplicationAndProject(); } private void scheduleReloadApplicationAndProject() { + LOG.info("[STORAGE] Scheduling reload with myReloadBlockCount = " + myReloadBlockCount); + ApplicationManager.getApplication().invokeLater(new Runnable() { public void run() { + LOG.info("[STORAGE] trying reloading application and should reload project"); if (!tryToReloadApplication()) return; + LOG.info("[STORAGE] reloading project"); askToReloadProjectIfConfigFilesChangedExternally(); } @@ -747,17 +768,17 @@ public class ProjectManagerImpl extends ProjectManagerEx implements NamedJDOMExt registerProjectToReload(project, file, storage); } - private void registerProjectToReload(final Project project, final VirtualFile cause, final StateStorage storage) { if (project != null) { - List> changedProjectFiles = myChangedProjectFiles.get(project); + synchronized (myChangedProjectFiles) { + List> changedProjectFiles = myChangedProjectFiles.get(project); + if (changedProjectFiles == null) { + changedProjectFiles = new ArrayList>(); + myChangedProjectFiles.put(project, changedProjectFiles); + } - if (changedProjectFiles == null) { - changedProjectFiles = new ArrayList>(); - myChangedProjectFiles.put(project, changedProjectFiles); + changedProjectFiles.add(new Pair(cause, storage)); } - - changedProjectFiles.add(new Pair(cause, storage)); } else { myChangedApplicationFiles.add(new Pair(cause, storage));