Updated Branches: refs/heads/master 349ef6220 -> c33d445fb
Remove accidentally dependency on Guava's AtomicDouble Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/c33d445f Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/c33d445f Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/c33d445f Branch: refs/heads/master Commit: c33d445fb5f2bb3807bef3884e3888e3f27683ad Parents: 349ef62 Author: Howard M. Lewis Ship <[email protected]> Authored: Thu Apr 25 09:53:57 2013 -0700 Committer: Howard M. Lewis Ship <[email protected]> Committed: Thu Apr 25 09:53:57 2013 -0700 ---------------------------------------------------------------------- .../services/metrics/MetricCollectorImpl.java | 19 ++++++++++++-- 1 files changed, 16 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/c33d445f/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/metrics/MetricCollectorImpl.java ---------------------------------------------------------------------- diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/metrics/MetricCollectorImpl.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/metrics/MetricCollectorImpl.java index 14ff478..4a5b5bf 100644 --- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/metrics/MetricCollectorImpl.java +++ b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/metrics/MetricCollectorImpl.java @@ -14,7 +14,6 @@ package org.apache.tapestry5.ioc.internal.services.metrics; -import com.google.common.util.concurrent.AtomicDouble; import org.apache.tapestry5.func.F; import org.apache.tapestry5.ioc.annotations.PostInjection; import org.apache.tapestry5.ioc.annotations.PreventServiceDecoration; @@ -39,6 +38,7 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; @PreventServiceDecoration public class MetricCollectorImpl extends LockSupport implements MetricCollector, Runnable @@ -75,7 +75,7 @@ public class MetricCollectorImpl extends LockSupport implements MetricCollector, // TODO: May want to initialize this from stored data for Type.TOTAL - private final AtomicDouble accumulator = new AtomicDouble(); + private final AtomicReference<Double> accumulator = new AtomicReference<Double>(0d); MetricImpl(MetricImpl parent, String name, Type type, Units units) { @@ -207,7 +207,20 @@ public class MetricCollectorImpl extends LockSupport implements MetricCollector, public void accumulate(double value) { - accumulator.addAndGet(value); + while (true) + { + Double current = accumulator.get(); + Double updated = current + value; + + // This is where an Atomic is better than a simple volatile, we can detect + // when a race condition would have caused the loss of data by overlapping + // read-and-increment operations. Still miss Clojure's approach, of course. + + if (accumulator.compareAndSet(current, updated)) + { + break; + } + } if (parent != null) {
