aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/java/kamon/jsr166/Striped64.java
diff options
context:
space:
mode:
Diffstat (limited to 'kamon-core/src/main/java/kamon/jsr166/Striped64.java')
-rw-r--r--kamon-core/src/main/java/kamon/jsr166/Striped64.java19
1 files changed, 19 insertions, 0 deletions
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() {