diff options
author | Ivan Topolnjak <ivantopo@gmail.com> | 2016-10-04 19:52:09 +0200 |
---|---|---|
committer | Diego Parra <diegolparra@gmail.com> | 2016-10-04 19:52:09 +0200 |
commit | ddd73214a61182823b8f1897687d8d16bb40390b (patch) | |
tree | 2acec2dd5b78712b13836f60dd984305e3821e08 /kamon-core/src/main/java/kamon/jsr166 | |
parent | be07f2cded403b5939d5b7c0817444dd9b3f9e4e (diff) | |
download | Kamon-ddd73214a61182823b8f1897687d8d16bb40390b.tar.gz Kamon-ddd73214a61182823b8f1897687d8d16bb40390b.tar.bz2 Kamon-ddd73214a61182823b8f1897687d8d16bb40390b.zip |
Cas collect compatibility with earlier jvms (#399)
! core: introduce CAS for safer counter collection and inline implementation of Unsafe.getAndSetLong for <jdk8 compatibility.
Diffstat (limited to 'kamon-core/src/main/java/kamon/jsr166')
-rw-r--r-- | kamon-core/src/main/java/kamon/jsr166/LongAdder.java | 15 | ||||
-rw-r--r-- | kamon-core/src/main/java/kamon/jsr166/Striped64.java | 19 |
2 files changed, 34 insertions, 0 deletions
diff --git a/kamon-core/src/main/java/kamon/jsr166/LongAdder.java b/kamon-core/src/main/java/kamon/jsr166/LongAdder.java index 18f91759..7e47ae63 100644 --- a/kamon-core/src/main/java/kamon/jsr166/LongAdder.java +++ b/kamon-core/src/main/java/kamon/jsr166/LongAdder.java @@ -151,6 +151,21 @@ public class LongAdder extends Striped64 implements Serializable { return sum; } + public long sumAndReset() { + long sum = getAndSetBase(0L); + Cell[] as = cells; + if (as != null) { + int n = as.length; + for (int i = 0; i < n; ++i) { + Cell a = as[i]; + if (a != null) { + sum += a.getAndSet(0L); + } + } + } + return sum; + } + /** * Returns the String representation of the {@link #sum}. * @return the String representation of the {@link #sum} diff --git a/kamon-core/src/main/java/kamon/jsr166/Striped64.java b/kamon-core/src/main/java/kamon/jsr166/Striped64.java index 4840c8d7..8fbfa4ba 100644 --- a/kamon-core/src/main/java/kamon/jsr166/Striped64.java +++ b/kamon-core/src/main/java/kamon/jsr166/Striped64.java @@ -105,6 +105,14 @@ abstract class Striped64 extends Number { return UNSAFE.compareAndSwapLong(this, valueOffset, cmp, val); } + final long getAndSet(long val) { + long v; + do { + v = UNSAFE.getLongVolatile(this, valueOffset); + } while (!UNSAFE.compareAndSwapLong(this, valueOffset, v, val)); + return v; + } + // Unsafe mechanics private static final sun.misc.Unsafe UNSAFE; private static final long valueOffset; @@ -182,6 +190,17 @@ abstract class Striped64 extends Number { } /** + * CASes the base field. + */ + final long getAndSetBase(long val) { + long v; + do { + v = UNSAFE.getLongVolatile(this, baseOffset); + } while (!UNSAFE.compareAndSwapLong(this, baseOffset, v, val)); + return v; + } + + /** * CASes the busy field from 0 to 1 to acquire lock. */ final boolean casBusy() { |