From e3dd4dd5d761e090fd18e43dbf267343e9d03d3e Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Thu, 29 Mar 2012 18:51:11 +0400 Subject: [PATCH] IDEA-83670 CME Access myRepositories under read lock. Copy to a temp variable in updateAllRepositories not to lock during update. --- .../repo/GitRepositoryManagerImpl.java | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/plugins/git4idea/src/git4idea/repo/GitRepositoryManagerImpl.java b/plugins/git4idea/src/git4idea/repo/GitRepositoryManagerImpl.java index 6975469ef6e1..c5e78b02c9ca 100644 --- a/plugins/git4idea/src/git4idea/repo/GitRepositoryManagerImpl.java +++ b/plugins/git4idea/src/git4idea/repo/GitRepositoryManagerImpl.java @@ -137,15 +137,32 @@ public class GitRepositoryManagerImpl extends AbstractProjectComponent implement @Override public void updateAllRepositories(GitRepository.TrackedTopic... topics) { - for (VirtualFile root : myRepositories.keySet()) { + Map repositories; + try { + REPO_LOCK.readLock().lock(); + repositories = new HashMap(myRepositories); + } + finally { + REPO_LOCK.readLock().unlock(); + } + + for (VirtualFile root : repositories.keySet()) { updateRepository(root, topics); } } // note: we are not calling this method during the project startup - it is called anyway by the GitRootTracker private void updateRepositoriesCollection() { - Map repositories = new HashMap(myRepositories); - final VirtualFile[] roots = myVcsManager.getRootsUnderVcs(myVcs); + Map repositories; + try { + REPO_LOCK.readLock().lock(); + repositories = new HashMap(myRepositories); + } + finally { + REPO_LOCK.readLock().unlock(); + } + + final VirtualFile[] roots = myVcsManager.getRootsUnderVcs(myVcs); // remove repositories that are not in the roots anymore for (Iterator> iterator = repositories.entrySet().iterator(); iterator.hasNext(); ) { if (!ArrayUtil.contains(iterator.next().getValue().getRoot(), roots)) {