Skip to main content
aboutsummaryrefslogtreecommitdiffstats
path: root/dsf
diff options
context:
space:
mode:
authorPawel Piech2010-03-24 18:50:29 +0000
committerPawel Piech2010-03-24 18:50:29 +0000
commit1ba8d3916d0eb69237907c90db11b341b635f04b (patch)
treeb0e42ac514b911d91e14598a234197de108c347e /dsf
parent04709d28763d09409474ce654fab8db9a1ab09d9 (diff)
downloadorg.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.java65
-rw-r--r--dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/concurrent/RequestMonitor.java36
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() {

Back to the top