Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Lay2012-05-09 15:04:43 +0000
committerMatthias Sohn2012-05-11 22:24:06 +0000
commit62f7bfff93f5a53e2281af52eaa479c4998e1db6 (patch)
tree363d8c25226b723647d809397a66e8131bf72165 /org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GenerateHistoryJob.java
parent2513d3008c301a6011f1d631b60035aa43ae9c72 (diff)
downloadegit-62f7bfff93f5a53e2281af52eaa479c4998e1db6.tar.gz
egit-62f7bfff93f5a53e2281af52eaa479c4998e1db6.tar.xz
egit-62f7bfff93f5a53e2281af52eaa479c4998e1db6.zip
Fix memory leak in GitHistoryPage
When a GenerateHistoryJob was cancelled because a new input was set the SWTCommitList was not deregistered as DisposeListener. The List held references to all SWTCommits which could consume several hundreds of MB for large repos. Change-Id: I95b3f79ce883bb65cc168d7288040826d6fde514 Signed-off-by: Stefan Lay <stefan.lay@sap.com> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
Diffstat (limited to 'org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GenerateHistoryJob.java')
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GenerateHistoryJob.java26
1 files changed, 26 insertions, 0 deletions
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GenerateHistoryJob.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GenerateHistoryJob.java
index 1580e240c7..822624b913 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GenerateHistoryJob.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GenerateHistoryJob.java
@@ -14,7 +14,9 @@ import java.text.MessageFormat;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.JobFamilies;
import org.eclipse.egit.ui.UIPreferences;
@@ -24,6 +26,7 @@ import org.eclipse.jgit.revwalk.RevFlag;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
class GenerateHistoryJob extends Job {
private static final int BATCH_SIZE = 256;
@@ -132,6 +135,29 @@ class GenerateHistoryJob extends Job {
}
}
+ void release() {
+ if (getState() == Job.NONE)
+ dispose();
+ else
+ addJobChangeListener(new JobChangeAdapter() {
+ @Override
+ public void done(final IJobChangeEvent event) {
+ dispose();
+ }
+ });
+
+ }
+
+ private void dispose() {
+ walk.release();
+ Display.getDefault().asyncExec(new Runnable() {
+
+ public void run() {
+ allCommits.dispose();
+ }
+ });
+ }
+
@Override
public boolean belongsTo(Object family) {
if (family.equals(JobFamilies.GENERATE_HISTORY))

Back to the top