aboutsummaryrefslogtreecommitdiff
path: root/kamon-core
diff options
context:
space:
mode:
authorIvan Topolnjak <ivantopo@gmail.com>2016-10-04 19:52:09 +0200
committerDiego Parra <diegolparra@gmail.com>2016-10-04 19:52:09 +0200
commitddd73214a61182823b8f1897687d8d16bb40390b (patch)
tree2acec2dd5b78712b13836f60dd984305e3821e08 /kamon-core
parentbe07f2cded403b5939d5b7c0817444dd9b3f9e4e (diff)
downloadKamon-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')
-rw-r--r--kamon-core/src/main/java/kamon/jsr166/LongAdder.java15
-rw-r--r--kamon-core/src/main/java/kamon/jsr166/Striped64.java19
-rw-r--r--kamon-core/src/main/scala/kamon/metric/instrument/Counter.scala2
3 files changed, 35 insertions, 1 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() {
diff --git a/kamon-core/src/main/scala/kamon/metric/instrument/Counter.scala b/kamon-core/src/main/scala/kamon/metric/instrument/Counter.scala
index 349a12bd..b7ab60de 100644
--- a/kamon-core/src/main/scala/kamon/metric/instrument/Counter.scala
+++ b/kamon-core/src/main/scala/kamon/metric/instrument/Counter.scala
@@ -48,7 +48,7 @@ class LongAdderCounter extends Counter {
counter.add(times)
}
- def collect(context: CollectionContext): Counter.Snapshot = CounterSnapshot(counter.sumThenReset())
+ def collect(context: CollectionContext): Counter.Snapshot = CounterSnapshot(counter.sumAndReset())
def cleanup: Unit = {}
}