From 2e86fdcc8f2d9fd371ada2d221f70ccd5a5af04f Mon Sep 17 00:00:00 2001 From: Eike Stepper Date: Tue, 9 Dec 2008 19:25:43 +0000 Subject: [258067] Provide RequestWithMonitoring example https://bugs.eclipse.org/bugs/show_bug.cgi?id=258067 --- .../org/eclipse/net4j/tests/SignalMonitorTest.java | 2 +- .../net4j/util/om/monitor/EclipseMonitor.java | 4 +- .../org/eclipse/net4j/util/om/monitor/Monitor.java | 8 ++-- .../net4j/util/om/monitor/NestedMonitor.java | 44 +++++++++++++++------- .../eclipse/net4j/util/om/monitor/OMMonitor.java | 7 +++- .../net4j/signal/IndicationWithMonitoring.java | 4 +- .../net4j/signal/RequestWithMonitoring.java | 6 +-- 7 files changed, 48 insertions(+), 27 deletions(-) diff --git a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/SignalMonitorTest.java b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/SignalMonitorTest.java index e9af20aba6..5978578a39 100644 --- a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/SignalMonitorTest.java +++ b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/SignalMonitorTest.java @@ -176,7 +176,7 @@ public class SignalMonitorTest extends AbstractTransportTest } @Override - public void worked(int work) + public void worked(double work) { super.worked(work); System.out.println("work: " + getWork()); diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/om/monitor/EclipseMonitor.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/om/monitor/EclipseMonitor.java index 6335750981..ee5258a9e5 100644 --- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/om/monitor/EclipseMonitor.java +++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/om/monitor/EclipseMonitor.java @@ -59,10 +59,10 @@ public class EclipseMonitor extends Monitor } @Override - public synchronized void worked(int work) throws MonitorCanceledException + public synchronized void worked(double work) throws MonitorCanceledException { super.worked(work); - progressMonitor.worked(work); + progressMonitor.internalWorked(work); } @Override diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/om/monitor/Monitor.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/om/monitor/Monitor.java index 3a534f2bc2..2cd802ae42 100644 --- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/om/monitor/Monitor.java +++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/om/monitor/Monitor.java @@ -18,7 +18,7 @@ public class Monitor implements OMMonitor { private int totalWork; - private int work; + private double work; private boolean canceled; @@ -45,7 +45,7 @@ public class Monitor implements OMMonitor this.totalWork = totalWork; } - public synchronized void worked(int work) throws MonitorCanceledException + public synchronized void worked(double work) throws MonitorCanceledException { checkCanceled(); this.work += work; @@ -60,7 +60,7 @@ public class Monitor implements OMMonitor public synchronized void done() { checkCanceled(); - int rest = totalWork - work; + double rest = totalWork - work; if (rest > 0) { worked(rest); @@ -72,7 +72,7 @@ public class Monitor implements OMMonitor return totalWork; } - public synchronized int getWork() + public synchronized double getWork() { return work; } diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/om/monitor/NestedMonitor.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/om/monitor/NestedMonitor.java index e957ea4d68..d2794b3e60 100644 --- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/om/monitor/NestedMonitor.java +++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/om/monitor/NestedMonitor.java @@ -16,16 +16,22 @@ package org.eclipse.net4j.util.om.monitor; */ public class NestedMonitor extends Monitor { + private static final double ZERO = 0.0d; + private OMMonitor parent; private int parentWork; - private float propagateWork; + private double sentToParent; + + private double scale; + + private boolean usedUp; public NestedMonitor(OMMonitor parent, int parentWork) { this.parent = parent; - this.parentWork = parentWork; + this.parentWork = parentWork > 0 ? parentWork : 0; } public OMMonitor getParent() @@ -39,20 +45,32 @@ public class NestedMonitor extends Monitor } @Override - public synchronized void worked(int work) throws MonitorCanceledException + public synchronized void begin(int totalWork) throws MonitorCanceledException { - super.worked(work); - float ratio = getWork(); - ratio /= getTotalWork(); - propagateWork += ratio; + super.begin(totalWork); + scale = totalWork > ZERO ? (double)parentWork / (double)totalWork : ZERO; + } - int parentTicks = (int)Math.floor(propagateWork * getParentWork()); - if (parentTicks > 0) + @Override + public synchronized void worked(double work) throws MonitorCanceledException + { + if (!usedUp) { - parent.worked(parentTicks); - float rest = parentTicks; - rest /= getParentWork(); - propagateWork -= rest; + super.worked(work); + double realWork = work > ZERO ? scale * work : ZERO; + parent.worked(realWork); + sentToParent += realWork; + if (sentToParent >= parentWork) + { + usedUp = true; + } } } + + @Override + public synchronized void done() + { + super.done(); + sentToParent = ZERO; + } } diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/om/monitor/OMMonitor.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/om/monitor/OMMonitor.java index bca54034c6..b127388d63 100644 --- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/om/monitor/OMMonitor.java +++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/om/monitor/OMMonitor.java @@ -30,7 +30,10 @@ public interface OMMonitor */ public void begin(int totalWork) throws MonitorCanceledException; - public void worked(int work) throws MonitorCanceledException; + /** + * @since 2.0 + */ + public void worked(double work) throws MonitorCanceledException; /** * @since 2.0 @@ -42,7 +45,7 @@ public interface OMMonitor /** * @since 2.0 */ - public int getWork(); + public double getWork(); /** * @since 2.0 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 ba2fcf697a..8519c722f8 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 @@ -112,7 +112,7 @@ public abstract class IndicationWithMonitoring extends IndicationWithResponse if (monitor != null) { // Keep sendProgress into the locks... otherwise when interrupt it seems to freeze. - sendProgress(monitor.getTotalWork(), monitor.getWork()); + sendProgress(monitor.getTotalWork(), (int)monitor.getWork()); } } @@ -211,7 +211,7 @@ public abstract class IndicationWithMonitoring extends IndicationWithResponse } @Override - public synchronized void worked(int work) + public synchronized void worked(double work) { setLastMonitorAccess(); super.worked(work); diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/RequestWithMonitoring.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/RequestWithMonitoring.java index 7d00d149ea..4b0a3674e7 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/RequestWithMonitoring.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/RequestWithMonitoring.java @@ -258,13 +258,13 @@ public abstract class RequestWithMonitoring extends RequestWithConfirmat } else { - float oldRatio = remoteMonitor.getWork(); + double oldRatio = remoteMonitor.getWork(); oldRatio /= remoteMonitor.getTotalWork(); - float newRatio = work; + double newRatio = work; newRatio /= totalWork; - float newWork = newRatio - oldRatio; + double newWork = newRatio - oldRatio; newWork *= remoteMonitor.getTotalWork(); if (newWork >= 1.0) { -- cgit v1.2.3