mirror of
https://github.com/corda/corda.git
synced 2025-01-05 20:54:13 +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