diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/LineStatusTracker.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/LineStatusTracker.java index 3bcfd4a6f6d0..27beb9ccae27 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/LineStatusTracker.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/LineStatusTracker.java @@ -77,6 +77,7 @@ public class LineStatusTracker { private boolean myAnathemaThrown; private FileEditorManager myFileEditorManager; private final VirtualFile myVirtualFile; + private volatile boolean myReleased; private LineStatusTracker(final Document document, final Document upToDateDocument, final Project project, final VirtualFile virtualFile) { myVirtualFile = virtualFile; @@ -89,10 +90,12 @@ public class LineStatusTracker { myRanges = new ArrayList(); myAnathemaThrown = false; myFileEditorManager = FileEditorManager.getInstance(myProject); + myReleased = false; } public void initialize(@NotNull final String upToDateContent, @NotNull RevisionPack baseRevisionNumber) { ApplicationManager.getApplication().assertIsDispatchThread(); + if (myReleased) return; synchronized (myLock) { try { @@ -166,6 +169,7 @@ public class LineStatusTracker { @SuppressWarnings({"AutoBoxing"}) private RangeHighlighter createHighlighter(final Range range) { + assert ! myReleased; int first = range.getOffset1() >= myDocument.getLineCount() ? myDocument.getTextLength() : myDocument.getLineStartOffset(range.getOffset1()); @@ -204,6 +208,7 @@ public class LineStatusTracker { removeHighlightersFromMarkupModel(); myRanges.clear(); } + myReleased = true; } public Document getDocument() { @@ -228,6 +233,7 @@ public class LineStatusTracker { } public void startBulkUpdate() { + if (myReleased) return; synchronized (myLock) { myBulkUpdate = true; removeAnathema(); @@ -247,6 +253,7 @@ public class LineStatusTracker { } public void finishBulkUpdate() { + if (myReleased) return; synchronized (myLock) { myBulkUpdate = false; reinstallRanges(); @@ -286,6 +293,7 @@ public class LineStatusTracker { private final VcsDirtyScopeManager myVcsDirtyScopeManager = VcsDirtyScopeManager.getInstance(myProject); public void beforeDocumentChange(DocumentEvent e) { + if (myReleased) return; myApplication.assertWriteAccessAllowed(); synchronized (myLock) { @@ -338,6 +346,11 @@ public class LineStatusTracker { } public void documentChanged(final DocumentEvent e) { + if (myReleased) { + return; + } + // TODO: remove assertion when cached document listeners will work ok + //assert ! myReleased; myApplication.assertWriteAccessAllowed(); synchronized (myLock) { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/LineStatusTrackerManager.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/LineStatusTrackerManager.java index 37e2a0df0656..ccd8400d2534 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/LineStatusTrackerManager.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/LineStatusTrackerManager.java @@ -212,14 +212,9 @@ public class LineStatusTrackerManager implements ProjectComponent, LineStatusTra if (tracker == null && (! shouldBeInstalled)) return; if (tracker != null) { - if (! shouldBeInstalled) { - releaseTracker(document); - return; - } else { - tracker.resetForBaseRevisionLoad(); - startAlarm(document, virtualFile); - } - } else if (shouldBeInstalled) { + releaseTracker(document); + } + if (shouldBeInstalled) { installTracker(virtualFile, document); } }