From 301f10e751e02e62a75c54701f0536d9cf291cb6 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Tue, 27 Mar 2012 17:58:42 +0400 Subject: [PATCH] IDEA-83561 Deadlock in GitRepositoryManager Minimize locking when updating repositories collection [reviewed by yole] (cherry picked from commit 82a2cb4) --- .../git4idea/repo/GitRepositoryManagerImpl.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/plugins/git4idea/src/git4idea/repo/GitRepositoryManagerImpl.java b/plugins/git4idea/src/git4idea/repo/GitRepositoryManagerImpl.java index b88de0d1f5d2..6975469ef6e1 100644 --- a/plugins/git4idea/src/git4idea/repo/GitRepositoryManagerImpl.java +++ b/plugins/git4idea/src/git4idea/repo/GitRepositoryManagerImpl.java @@ -144,22 +144,21 @@ public class GitRepositoryManagerImpl extends AbstractProjectComponent implement // note: we are not calling this method during the project startup - it is called anyway by the GitRootTracker private void updateRepositoriesCollection() { - try { - REPO_LOCK.writeLock().lock(); + Map repositories = new HashMap(myRepositories); final VirtualFile[] roots = myVcsManager.getRootsUnderVcs(myVcs); // remove repositories that are not in the roots anymore - for (Iterator> iterator = myRepositories.entrySet().iterator(); iterator.hasNext(); ) { + for (Iterator> iterator = repositories.entrySet().iterator(); iterator.hasNext(); ) { if (!ArrayUtil.contains(iterator.next().getValue().getRoot(), roots)) { iterator.remove(); } } // add GitRepositories for all roots that don't have correspondent GitRepositories yet. for (VirtualFile root : roots) { - if (!myRepositories.containsKey(root)) { + if (!repositories.containsKey(root)) { if (gitRootOK(root)) { try { GitRepository repository = createGitRepository(root); - myRepositories.put(root, repository); + repositories.put(root, repository); } catch (GitRepoStateException e) { LOG.error("Couldn't initialize GitRepository in " + root.getPresentableUrl(), e); @@ -170,6 +169,11 @@ public class GitRepositoryManagerImpl extends AbstractProjectComponent implement } } } + + REPO_LOCK.writeLock().lock(); + try { + myRepositories.clear(); + myRepositories.putAll(repositories); } finally { REPO_LOCK.writeLock().unlock();