From 200e378b9c5ad47510611e6ba3d2fcd1969e5bf4 Mon Sep 17 00:00:00 2001 From: Julia Beliaeva Date: Thu, 23 Nov 2017 00:29:00 +0300 Subject: [PATCH] [vcs-log] dispose single task controller with project as well --- .../com/intellij/vcs/log/data/SingleTaskController.java | 9 +++++++-- .../com/intellij/vcs/log/data/VcsLogRefresherImpl.java | 5 ++--- .../vcs/log/data/index/VcsLogPersistentIndex.java | 8 ++++---- .../vcs/log/visible/VisiblePackRefresherImpl.java | 5 ++--- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/SingleTaskController.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/SingleTaskController.java index fc0d2ea2ff26..2ddbe21e6087 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/SingleTaskController.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/SingleTaskController.java @@ -18,6 +18,8 @@ package com.intellij.vcs.log.data; import com.intellij.openapi.Disposable; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Disposer; import com.intellij.util.Consumer; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -50,10 +52,13 @@ public abstract class SingleTaskController implements Disposabl private boolean myIsDisposed = false; - public SingleTaskController(@NotNull Consumer handler, boolean cancelRunning) { + public SingleTaskController(@NotNull Project project, @NotNull Consumer handler, boolean cancelRunning, @NotNull Disposable parent) { myResultHandler = handler; myAwaitingRequests = ContainerUtil.newLinkedList(); myCancelRunning = cancelRunning; + + Disposer.register(parent, () -> Disposer.dispose(this)); + Disposer.register(project, this); } /** @@ -158,7 +163,7 @@ public abstract class SingleTaskController implements Disposabl synchronized (LOCK) { if (myIsDisposed) return; myIsDisposed = true; - + if (myRunningTask != null) { myRunningTask.cancel(); myRunningTask = null; diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogRefresherImpl.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogRefresherImpl.java index 3aba2f1c2503..415d4ce9403c 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogRefresherImpl.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogRefresherImpl.java @@ -80,17 +80,16 @@ public class VcsLogRefresherImpl implements VcsLogRefresher, Disposable { myRecentCommitCount = recentCommitsCount; myProgress = progress; - mySingleTaskController = new SingleTaskController(dataPack -> { + mySingleTaskController = new SingleTaskController(myProject, dataPack -> { myDataPack = dataPack; dataPackUpdateHandler.consume(dataPack); - }, false) { + }, false, this) { @NotNull @Override protected ProgressIndicator startNewBackgroundTask() { return VcsLogRefresherImpl.this.startNewBackgroundTask(new MyRefreshTask(myDataPack)); } }; - Disposer.register(this, mySingleTaskController); } protected ProgressIndicator startNewBackgroundTask(@NotNull final Task.Backgroundable refreshTask) { diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/index/VcsLogPersistentIndex.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/index/VcsLogPersistentIndex.java index aa40e353b7e3..7504198139fd 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/index/VcsLogPersistentIndex.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/index/VcsLogPersistentIndex.java @@ -106,7 +106,6 @@ public class VcsLogPersistentIndex implements VcsLogIndex, Disposable { myProviders = providers; myFatalErrorsConsumer = fatalErrorsConsumer; myRoots = ContainerUtil.newLinkedHashSet(); - mySingleTaskController = new MySingleTaskController(project); myBigRepositoriesList = VcsLogBigRepositoriesList.getInstance(); for (Map.Entry entry : providers.entrySet()) { @@ -131,7 +130,8 @@ public class VcsLogPersistentIndex implements VcsLogIndex, Disposable { myIndexingLimit.put(root, new AtomicInteger(getIndexingLimit())); } - Disposer.register(myIndexStorage != null ? myIndexStorage : this, mySingleTaskController); + mySingleTaskController = new MySingleTaskController(project, myIndexStorage != null ? myIndexStorage : this); + Disposer.register(disposableParent, this); } @@ -542,8 +542,8 @@ public class VcsLogPersistentIndex implements VcsLogIndex, Disposable { private static final int LOW_PRIORITY = Thread.MIN_PRIORITY; @NotNull private final HeavyAwareExecutor myHeavyAwareExecutor; - public MySingleTaskController(@NotNull Project project) { - super(EmptyConsumer.getInstance(), false); + public MySingleTaskController(@NotNull Project project, @NotNull Disposable parent) { + super(project, EmptyConsumer.getInstance(), false, parent); myHeavyAwareExecutor = new HeavyAwareExecutor(project, 50, 100, VcsLogPersistentIndex.this); } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/visible/VisiblePackRefresherImpl.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/visible/VisiblePackRefresherImpl.java index 41921d26a428..67c523da455a 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/visible/VisiblePackRefresherImpl.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/visible/VisiblePackRefresherImpl.java @@ -60,7 +60,7 @@ public class VisiblePackRefresherImpl implements VisiblePackRefresher, Disposabl myVisiblePackBuilder = builder; myState = new State(initialSortType); - myTaskController = new SingleTaskController(state -> { + myTaskController = new SingleTaskController(project, state -> { boolean hasChanges = myState.getVisiblePack() != state.getVisiblePack(); myState = state; if (hasChanges) { @@ -68,7 +68,7 @@ public class VisiblePackRefresherImpl implements VisiblePackRefresher, Disposabl listener.onVisiblePackChange(state.getVisiblePack()); } } - }, true) { + }, true, this) { @NotNull @Override protected ProgressIndicator startNewBackgroundTask() { @@ -80,7 +80,6 @@ public class VisiblePackRefresherImpl implements VisiblePackRefresher, Disposabl return indicator; } }; - Disposer.register(this, myTaskController); myIndexingFinishedListener = root -> myTaskController.request(new IndexingFinishedRequest(root)); myLogData.getIndex().addListener(myIndexingFinishedListener);