diff options
author | Pawel Piech | 2010-03-24 18:50:29 +0000 |
---|---|---|
committer | Pawel Piech | 2010-03-24 18:50:29 +0000 |
commit | 1ba8d3916d0eb69237907c90db11b341b635f04b (patch) | |
tree | b0e42ac514b911d91e14598a234197de108c347e /dsf | |
parent | 04709d28763d09409474ce654fab8db9a1ab09d9 (diff) | |
download | org.eclipse.cdt-1ba8d3916d0eb69237907c90db11b341b635f04b.tar.gz org.eclipse.cdt-1ba8d3916d0eb69237907c90db11b341b635f04b.tar.xz org.eclipse.cdt-1ba8d3916d0eb69237907c90db11b341b635f04b.zip |
[306982] - [concurrent] DsfRunnable.finalize() method increases the cost of garbage collecting 10x
Diffstat (limited to 'dsf')
-rw-r--r-- | dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/DsfExecutable.java | 65 | ||||
-rw-r--r-- | dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/RequestMonitor.java | 36 |
2 files changed, 57 insertions, 44 deletions
diff --git a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/DsfExecutable.java b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/DsfExecutable.java index a93eb722bcb..3ff34ed67e4 100644 --- a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/DsfExecutable.java +++ b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/DsfExecutable.java @@ -14,7 +14,6 @@ import java.util.HashSet; import java.util.Set; import org.eclipse.cdt.dsf.internal.DsfPlugin; -import org.eclipse.cdt.dsf.internal.LoggingUtils; import org.eclipse.core.runtime.Platform; /** @@ -181,34 +180,38 @@ public class DsfExecutable { return true; } - /** - * Checks to see if the object was executed before being garbage collected. - * If not, and it's expected to have been, then output a trace message to - * that effect. - * - * @see java.lang.Object#finalize() - */ - @Override - protected void finalize() { - if (DEBUG_EXECUTOR && !fSubmitted && isExecutionRequired()) { - StringBuilder traceBuilder = new StringBuilder(); - - // Record the time - traceBuilder.append(DsfPlugin.getDebugTime()); - traceBuilder.append(' '); - - final String refstr = LoggingUtils.toString(this, false); - traceBuilder.append("DSF executable was never executed: " + refstr); //$NON-NLS-1$ - final String tostr = LoggingUtils.trimTrailingNewlines(this.toString()); - if (!tostr.equals(refstr)) { - traceBuilder.append(" ["); //$NON-NLS-1$ - traceBuilder.append(tostr); - traceBuilder.append(']'); - } - traceBuilder.append("\nCreated at:\n"); //$NON-NLS-1$ - traceBuilder.append(fCreatedAt); - - DsfPlugin.debug(traceBuilder.toString()); - } - } +// Bug 306982 +// Disable the use of finalize() method in DSF runnables tracing to avoid +// a performance penalty in garbage colleciton. +// +// /** +// * Checks to see if the object was executed before being garbage collected. +// * If not, and it's expected to have been, then output a trace message to +// * that effect. +// * +// * @see java.lang.Object#finalize() +// */ +// @Override +// protected void finalize() { +// if (DEBUG_EXECUTOR && !fSubmitted && isExecutionRequired()) { +// StringBuilder traceBuilder = new StringBuilder(); +// +// // Record the time +// traceBuilder.append(DsfPlugin.getDebugTime()); +// traceBuilder.append(' '); +// +// final String refstr = LoggingUtils.toString(this, false); +// traceBuilder.append("DSF executable was never executed: " + refstr); //$NON-NLS-1$ +// final String tostr = LoggingUtils.trimTrailingNewlines(this.toString()); +// if (!tostr.equals(refstr)) { +// traceBuilder.append(" ["); //$NON-NLS-1$ +// traceBuilder.append(tostr); +// traceBuilder.append(']'); +// } +// traceBuilder.append("\nCreated at:\n"); //$NON-NLS-1$ +// traceBuilder.append(fCreatedAt); +// +// DsfPlugin.debug(traceBuilder.toString()); +// } +// } } diff --git a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/RequestMonitor.java b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/RequestMonitor.java index cf63ebcd195..2357ea98da5 100644 --- a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/RequestMonitor.java +++ b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/RequestMonitor.java @@ -10,12 +10,13 @@ *******************************************************************************/ package org.eclipse.cdt.dsf.concurrent; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.Executor; import java.util.concurrent.RejectedExecutionException; import org.eclipse.cdt.dsf.internal.DsfPlugin; import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.ListenerList; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.Status; @@ -101,7 +102,7 @@ public class RequestMonitor extends DsfExecutable { */ private final RequestMonitor fParentRequestMonitor; - private ListenerList fCancelListeners; + private List<ICanceledListener> fCancelListeners; /** * Status @@ -110,6 +111,8 @@ public class RequestMonitor extends DsfExecutable { private boolean fCanceled = false; private boolean fDone = false; + private final ICanceledListener fCanceledListener; + /** * This field is never read by any code; its purpose is strictly to assist * developers debug DPF code. Developer can select this field in the @@ -144,12 +147,15 @@ public class RequestMonitor extends DsfExecutable { // this request monitor will automatically be canceled when the parent // is canceled. if (fParentRequestMonitor != null) { - fParentRequestMonitor.addCancelListener( - new ICanceledListener() { - public void requestCanceled(RequestMonitor rm) { - cancel(); - } - }); + fCanceledListener = new ICanceledListener() { + public void requestCanceled(RequestMonitor rm) { + cancel(); + } + }; + + fParentRequestMonitor.addCancelListener(fCanceledListener); + } else { + fCanceledListener = null; } if (DEBUG_MONITORS) { @@ -197,13 +203,13 @@ public class RequestMonitor extends DsfExecutable { * </p> */ public void cancel() { - Object[] listeners = null; + ICanceledListener[] listeners = null; synchronized (this) { // Check to make sure the request monitor wasn't previously canceled. if (!fCanceled) { fCanceled = true; if (fCancelListeners != null) { - listeners = fCancelListeners.getListeners(); + listeners = fCancelListeners.toArray(new ICanceledListener[fCancelListeners.size()]); } } } @@ -211,8 +217,8 @@ public class RequestMonitor extends DsfExecutable { // Call the listeners outside of a synchronized section to reduce the // risk of deadlocks. if (listeners != null) { - for (Object listener : listeners) { - ((ICanceledListener)listener).requestCanceled(this); + for (ICanceledListener listener : listeners) { + listener.requestCanceled(this); } } } @@ -237,7 +243,7 @@ public class RequestMonitor extends DsfExecutable { */ public synchronized void addCancelListener(ICanceledListener listener) { if (fCancelListeners == null) { - fCancelListeners = new ListenerList(); + fCancelListeners = new ArrayList<ICanceledListener>(1); } fCancelListeners.add(listener); } @@ -275,6 +281,10 @@ public class RequestMonitor extends DsfExecutable { // causes a memory leak. fCancelListeners = null; + if (fParentRequestMonitor != null) { + fParentRequestMonitor.removeCancelListener(fCanceledListener); + } + try { fExecutor.execute(new DsfRunnable() { public void run() { |