[vcs-log] dispose single task controller with project as well

This commit is contained in:
Julia Beliaeva
2017-11-27 18:47:57 +03:00
parent 780a40da0c
commit 200e378b9c
4 changed files with 15 additions and 12 deletions
@@ -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<Request, Result> implements Disposabl
private boolean myIsDisposed = false;
public SingleTaskController(@NotNull Consumer<Result> handler, boolean cancelRunning) {
public SingleTaskController(@NotNull Project project, @NotNull Consumer<Result> 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<Request, Result> implements Disposabl
synchronized (LOCK) {
if (myIsDisposed) return;
myIsDisposed = true;
if (myRunningTask != null) {
myRunningTask.cancel();
myRunningTask = null;
@@ -80,17 +80,16 @@ public class VcsLogRefresherImpl implements VcsLogRefresher, Disposable {
myRecentCommitCount = recentCommitsCount;
myProgress = progress;
mySingleTaskController = new SingleTaskController<RefreshRequest, DataPack>(dataPack -> {
mySingleTaskController = new SingleTaskController<RefreshRequest, DataPack>(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) {
@@ -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<VirtualFile, VcsLogProvider> 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);
}
@@ -60,7 +60,7 @@ public class VisiblePackRefresherImpl implements VisiblePackRefresher, Disposabl
myVisiblePackBuilder = builder;
myState = new State(initialSortType);
myTaskController = new SingleTaskController<Request, State>(state -> {
myTaskController = new SingleTaskController<Request, State>(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);