mirror of
https://github.com/corda/corda.git
synced 2025-01-22 12:28:11 +00:00
Start for a basic atomic implementation for avian. Still need to figure out how to do the Array versions of these. But I wanted to wait till we have the needed Unsafe implementation and add testing for these before we go further.
This commit is contained in:
parent
996e52170f
commit
99c59cfe94
61
classpath/java/util/concurrent/atomic/AtomicBoolean.java
Normal file
61
classpath/java/util/concurrent/atomic/AtomicBoolean.java
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
package java.util.concurrent.atomic;
|
||||||
|
|
||||||
|
public class AtomicBoolean implements java.io.Serializable {
|
||||||
|
private static final long serialVersionUID = 4654671469794556979L;
|
||||||
|
|
||||||
|
private static final int FALSE_VALUE = 0;
|
||||||
|
private static final int TRUE_VALUE = 1;
|
||||||
|
|
||||||
|
private final AtomicInteger value;
|
||||||
|
|
||||||
|
public AtomicBoolean() {
|
||||||
|
this(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AtomicBoolean(boolean initialValue) {
|
||||||
|
value = new AtomicInteger(intValue(initialValue));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int intValue(boolean value) {
|
||||||
|
return value ? TRUE_VALUE : FALSE_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean booleanValue(int value) {
|
||||||
|
if (value == TRUE_VALUE) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean get() {
|
||||||
|
return booleanValue(value.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean compareAndSet(boolean expect, boolean update) {
|
||||||
|
return value.compareAndSet(intValue(expect), intValue(update));
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean weakCompareAndSet(boolean expect, boolean update) {
|
||||||
|
return value.weakCompareAndSet(intValue(expect), intValue(update));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void set(boolean newValue) {
|
||||||
|
value.set(intValue(newValue));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void lazySet(boolean newValue) {
|
||||||
|
value.lazySet(intValue(newValue));
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean getAndSet(boolean newValue) {
|
||||||
|
int intResult = value.getAndSet(intValue(newValue));
|
||||||
|
|
||||||
|
return booleanValue(intResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return Boolean.toString(get());
|
||||||
|
}
|
||||||
|
}
|
126
classpath/java/util/concurrent/atomic/AtomicInteger.java
Normal file
126
classpath/java/util/concurrent/atomic/AtomicInteger.java
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
package java.util.concurrent.atomic;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
|
import sun.misc.Unsafe;
|
||||||
|
|
||||||
|
public class AtomicInteger extends Number implements java.io.Serializable {
|
||||||
|
private static final long serialVersionUID = 6214790243416807050L;
|
||||||
|
|
||||||
|
private static final Unsafe unsafe = Unsafe.getUnsafe();
|
||||||
|
private static final long valueOffset;
|
||||||
|
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
Field<?> f = AtomicInteger.class.getDeclaredField("value");
|
||||||
|
valueOffset = unsafe.objectFieldOffset(f);
|
||||||
|
} catch (NoSuchFieldException e) {
|
||||||
|
throw new Error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private volatile int value;
|
||||||
|
|
||||||
|
public AtomicInteger() {
|
||||||
|
this(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AtomicInteger(int initialValue) {
|
||||||
|
this.value = initialValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int get() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void set(int newValue) {
|
||||||
|
this.value = newValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void lazySet(int newValue) {
|
||||||
|
unsafe.putOrderedInt(this, valueOffset, newValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean compareAndSet(int expect, int update) {
|
||||||
|
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean weakCompareAndSet(int expect, int update) {
|
||||||
|
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAndSet(int newValue) {
|
||||||
|
while (true) {
|
||||||
|
int current = value;
|
||||||
|
if (compareAndSet(current, newValue)) {
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAndAdd(int delta) {
|
||||||
|
while (true) {
|
||||||
|
int current = value;
|
||||||
|
int next = current + delta;
|
||||||
|
if (compareAndSet(current, next)) {
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAndIncrement() {
|
||||||
|
return getAndAdd(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAndDecrement() {
|
||||||
|
return getAndAdd(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int addAndGet(int delta) {
|
||||||
|
while (true) {
|
||||||
|
int current = value;
|
||||||
|
int next = current + delta;
|
||||||
|
if (compareAndSet(current, next)) {
|
||||||
|
return next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int incrementAndGet() {
|
||||||
|
return addAndGet(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int decrementAndGet() {
|
||||||
|
return addAndGet(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte byteValue() {
|
||||||
|
return (byte)value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public short shortValue() {
|
||||||
|
return (short)value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int intValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long longValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float floatValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double doubleValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
126
classpath/java/util/concurrent/atomic/AtomicLong.java
Normal file
126
classpath/java/util/concurrent/atomic/AtomicLong.java
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
package java.util.concurrent.atomic;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
|
import sun.misc.Unsafe;
|
||||||
|
|
||||||
|
public class AtomicLong extends Number implements java.io.Serializable {
|
||||||
|
private static final long serialVersionUID = 1927816293512124184L;
|
||||||
|
|
||||||
|
private static final Unsafe unsafe = Unsafe.getUnsafe();
|
||||||
|
private static final long valueOffset;
|
||||||
|
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
Field<?> f = AtomicLong.class.getDeclaredField("value");
|
||||||
|
valueOffset = unsafe.objectFieldOffset(f);
|
||||||
|
} catch (NoSuchFieldException e) {
|
||||||
|
throw new Error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private volatile long value;
|
||||||
|
|
||||||
|
public AtomicLong() {
|
||||||
|
this(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AtomicLong(long initialValue) {
|
||||||
|
this.value = initialValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long get() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void set(long newValue) {
|
||||||
|
this.value = newValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void lazySet(long newValue) {
|
||||||
|
unsafe.putOrderedLong(this, valueOffset, newValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean compareAndSet(long expect, long update) {
|
||||||
|
return unsafe.compareAndSwapLong(this, valueOffset, expect, update);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean weakCompareAndSet(long expect, long update) {
|
||||||
|
return unsafe.compareAndSwapLong(this, valueOffset, expect, update);
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getAndSet(long newValue) {
|
||||||
|
while (true) {
|
||||||
|
long current = value;
|
||||||
|
if (compareAndSet(current, newValue)) {
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getAndAdd(long delta) {
|
||||||
|
while (true) {
|
||||||
|
long current = value;
|
||||||
|
long next = current + delta;
|
||||||
|
if (compareAndSet(current, next)) {
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getAndIncrement() {
|
||||||
|
return getAndAdd(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getAndDecrement() {
|
||||||
|
return getAndAdd(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public long addAndGet(long delta) {
|
||||||
|
while (true) {
|
||||||
|
long current = value;
|
||||||
|
long next = current + delta;
|
||||||
|
if (compareAndSet(current, next)) {
|
||||||
|
return next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public long incrementAndGet() {
|
||||||
|
return addAndGet(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public long decrementAndGet() {
|
||||||
|
return addAndGet(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte byteValue() {
|
||||||
|
return (byte)value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public short shortValue() {
|
||||||
|
return (short)value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int intValue() {
|
||||||
|
return (int)value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long longValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float floatValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double doubleValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
61
classpath/java/util/concurrent/atomic/AtomicReference.java
Normal file
61
classpath/java/util/concurrent/atomic/AtomicReference.java
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
package java.util.concurrent.atomic;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
|
import sun.misc.Unsafe;
|
||||||
|
|
||||||
|
public class AtomicReference<T> implements java.io.Serializable {
|
||||||
|
private static final long serialVersionUID = -1848883965231344442L;
|
||||||
|
|
||||||
|
private static final Unsafe unsafe = Unsafe.getUnsafe();
|
||||||
|
private static final long valueOffset;
|
||||||
|
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
Field<?> f = AtomicReference.class.getDeclaredField("value");
|
||||||
|
valueOffset = unsafe.objectFieldOffset(f);
|
||||||
|
} catch (NoSuchFieldException e) {
|
||||||
|
throw new Error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private volatile T value;
|
||||||
|
|
||||||
|
public AtomicReference() {
|
||||||
|
this(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AtomicReference(T initialValue) {
|
||||||
|
this.value = initialValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T get() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void lazySet(T newValue) {
|
||||||
|
unsafe.putOrderedObject(this, valueOffset, newValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean compareAndSet(T expect, T update) {
|
||||||
|
return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean weakCompareAndSet(T expect, T update) {
|
||||||
|
return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final T getAndSet(T newValue) {
|
||||||
|
while (true) {
|
||||||
|
T current = value;
|
||||||
|
if (compareAndSet(current, newValue)) {
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.valueOf(value);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user