Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon McDuff2008-12-06 14:49:18 +0000
committerSimon McDuff2008-12-06 14:49:18 +0000
commitd6b6be48651828c9d0b86eeb9359fa78ffda0631 (patch)
tree696b7ada42f374be9122bd66fdc42bd0d27a2f77 /plugins/org.eclipse.net4j/src
parentb17527fb79ddea633de0750216053dd74bdb47c5 (diff)
downloadcdo-d6b6be48651828c9d0b86eeb9359fa78ffda0631.tar.gz
cdo-d6b6be48651828c9d0b86eeb9359fa78ffda0631.tar.xz
cdo-d6b6be48651828c9d0b86eeb9359fa78ffda0631.zip
[257523] More than 1000 threads
https://bugs.eclipse.org/bugs/show_bug.cgi?id=257523
Diffstat (limited to 'plugins/org.eclipse.net4j/src')
-rw-r--r--plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/IndicationWithMonitoring.java49
1 files changed, 42 insertions, 7 deletions
diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/IndicationWithMonitoring.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/IndicationWithMonitoring.java
index 4e65e9efd2..879e6e956b 100644
--- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/IndicationWithMonitoring.java
+++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/IndicationWithMonitoring.java
@@ -15,13 +15,14 @@ import org.eclipse.net4j.buffer.BufferOutputStream;
import org.eclipse.net4j.util.concurrent.ConcurrencyUtil;
import org.eclipse.net4j.util.io.ExtendedDataInputStream;
import org.eclipse.net4j.util.io.ExtendedDataOutputStream;
-import org.eclipse.net4j.util.om.monitor.OMMonitor;
import org.eclipse.net4j.util.om.monitor.Monitor;
import org.eclipse.net4j.util.om.monitor.MonitorCanceledException;
+import org.eclipse.net4j.util.om.monitor.OMMonitor;
import org.eclipse.internal.net4j.bundle.OM;
import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
/**
* @author Eike Stepper
@@ -31,6 +32,10 @@ public abstract class IndicationWithMonitoring extends IndicationWithResponse
{
private Monitor monitor;
+ private Object monitorLock = new Object();
+
+ private Future<?> monitorFuture;
+
private long lastMonitorAccess;
/**
@@ -66,7 +71,17 @@ public abstract class IndicationWithMonitoring extends IndicationWithResponse
}
finally
{
- monitor = null;
+ synchronized (monitorLock)
+ {
+ if (monitor != null)
+ {
+ monitor = null;
+ if (monitorFuture != null)
+ {
+ monitorFuture.cancel(true);
+ }
+ }
+ }
}
}
@@ -79,7 +94,7 @@ public abstract class IndicationWithMonitoring extends IndicationWithResponse
{
monitor = new LastAccessMonitor();
setLastMonitorAccess();
- executorService.execute(new Runnable()
+ monitorFuture = executorService.submit(new Runnable()
{
public void run()
{
@@ -91,8 +106,25 @@ public abstract class IndicationWithMonitoring extends IndicationWithResponse
break;
}
- sendProgress(monitor.getTotalWork(), monitor.getWork());
- ConcurrencyUtil.sleep(monitorProgressInterval);
+ int monitorTotalWork = 0;
+ int monitorWork = 0;
+
+ synchronized (monitorLock)
+ {
+ if (monitor != null)
+ {
+ monitorTotalWork = monitor.getTotalWork();
+ monitorWork = monitor.getWork();
+ }
+ }
+
+ if (monitor != null)
+ {
+ // Keep sendProgress outside the monitorLock, so it doesn't block execute method.
+ sendProgress(monitorTotalWork, monitorWork);
+
+ ConcurrencyUtil.sleep(monitorProgressInterval);
+ }
}
}
@@ -143,9 +175,12 @@ public abstract class IndicationWithMonitoring extends IndicationWithResponse
void setMonitorCanceled()
{
- if (monitor != null)
+ synchronized (monitorLock)
{
- monitor.cancel();
+ if (monitor != null)
+ {
+ monitor.cancel();
+ }
}
}

Back to the top