From 214f6f62564dfb12febfed475f4bd6f7bc5107a7 Mon Sep 17 00:00:00 2001 From: Irina Chernushina Date: Fri, 14 Aug 2009 01:21:29 +0400 Subject: [PATCH] IDEADEV-39612 (Deadlock in ChangeListManagerImpl) --- .../openapi/vcs/changes/ChangeListManagerImpl.java | 22 +++++++++++-- .../intellij/openapi/vcs/changes/ChangesDelta.java | 37 ++-------------------- 2 files changed, 22 insertions(+), 37 deletions(-) diff --git a/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java b/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java index e6063aa141..b9b3ba467f 100644 --- a/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java +++ b/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java @@ -904,16 +904,18 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec private static class MyChangesDeltaForwarder implements PlusMinus> { private SlowlyClosingAlarm myAlarm; private RemoteRevisionsCache myRevisionsCache; + private final ProjectLevelVcsManager myVcsManager; public MyChangesDeltaForwarder(final Project project, final ExecutorService service) { myAlarm = ControlledAlarmFactory.createOnSharedThread(project, "changes delta consumer forwarder", service); myRevisionsCache = RemoteRevisionsCache.getInstance(project); + myVcsManager = ProjectLevelVcsManager.getInstance(project); } public void plus(final Pair stringAbstractVcsPair) { myAlarm.addRequest(new Runnable() { public void run() { - myRevisionsCache.plus(stringAbstractVcsPair); + myRevisionsCache.plus(getCorrectedPair(stringAbstractVcsPair)); } }); } @@ -921,9 +923,25 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec public void minus(final Pair stringAbstractVcsPair) { myAlarm.addRequest(new Runnable() { public void run() { - myRevisionsCache.minus(stringAbstractVcsPair); + myRevisionsCache.minus(getCorrectedPair(stringAbstractVcsPair)); } }); } + + private Pair getCorrectedPair(final Pair stringAbstractVcsPair) { + Pair correctedPair = stringAbstractVcsPair; + if (stringAbstractVcsPair.getSecond() == null) { + final String path = stringAbstractVcsPair.getFirst(); + correctedPair = new Pair(path, myVcsManager.findVcsByName(findVcs(path).getName())); + } + return correctedPair; + } + + @Nullable + private VcsKey findVcs(final String path) { + // does not matter directory or not + final AbstractVcs vcs = myVcsManager.getVcsFor(FilePathImpl.create(new File(path), false)); + return vcs == null ? null : vcs.getKeyInstanceMethod(); + } } } diff --git a/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesDelta.java b/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesDelta.java index 70afbcf0b4..1247697baf 100644 --- a/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesDelta.java +++ b/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesDelta.java @@ -3,14 +3,10 @@ package com.intellij.openapi.vcs.changes; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vcs.AbstractVcs; -import com.intellij.openapi.vcs.FilePathImpl; import com.intellij.openapi.vcs.ProjectLevelVcsManager; import com.intellij.openapi.vcs.VcsKey; import com.intellij.openapi.vcs.impl.CollectionsDelta; -import org.jetbrains.annotations.Nullable; -import java.io.File; -import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; @@ -28,7 +24,6 @@ public class ChangesDelta { public void step(final ChangeListsIndexes was, final ChangeListsIndexes became) { List> wasAffected = was.getAffectedFilesUnderVcs(); if (! myInitialized) { - wasAffected = fillVcsKeys(wasAffected); sendPlus(wasAffected); myInitialized = true; return; @@ -55,35 +50,7 @@ public class ChangesDelta { } private Pair convertPair(final Pair pair) { - return new Pair(pair.getFirst(), myVcsManager.findVcsByName(pair.getSecond().getName())); - } - - // we expect only "was" to don't know what vcses are - after deserialization - private List> fillVcsKeys(final List> coll) { - List> converted = null; - for (int i = 0; i < coll.size(); i++) { - final Pair pair = coll.get(i); - if (pair.getSecond() == null) { - final String fileKey = pair.getFirst(); - final VcsKey vcsKey = findVcs(fileKey); - if (converted == null) { - converted = new ArrayList>(coll.size()); - // copy first i-1 - for (int j = 0; j < i; j++) { - converted.add(coll.get(j)); - } - } - - converted.add(new Pair(fileKey, vcsKey)); - } - } - return converted != null ? converted : coll; - } - - @Nullable - private VcsKey findVcs(final String path) { - // does not matter directory or not - final AbstractVcs vcs = myVcsManager.getVcsFor(FilePathImpl.create(new File(path), false)); - return vcs == null ? null : vcs.getKeyInstanceMethod(); + final VcsKey vcsKey = pair.getSecond(); + return new Pair(pair.getFirst(), (vcsKey == null) ? null : myVcsManager.findVcsByName(vcsKey.getName())); } } -- 2.11.4.GIT