diff options
author | Simon McDuff | 2008-12-06 14:49:18 +0000 |
---|---|---|
committer | Simon McDuff | 2008-12-06 14:49:18 +0000 |
commit | d6b6be48651828c9d0b86eeb9359fa78ffda0631 (patch) | |
tree | 696b7ada42f374be9122bd66fdc42bd0d27a2f77 /plugins/org.eclipse.net4j/src | |
parent | b17527fb79ddea633de0750216053dd74bdb47c5 (diff) | |
download | cdo-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.java | 49 |
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(); + } } } |