8157171: Hook up Unsafe.weakCompareAndSetVolatile to VarHandles
Reviewed-by: psandoz, redestad
This commit is contained in:
parent
f8157334a8
commit
33bb9220fc
@ -165,8 +165,7 @@ final class VarHandle$Type$s {
|
||||
|
||||
@ForceInline
|
||||
static boolean weakCompareAndSetVolatile(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
|
||||
// TODO defer to strong form until new Unsafe method is added
|
||||
return UNSAFE.compareAndSwap$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
|
||||
return UNSAFE.weakCompareAndSwap$Type$Volatile(Objects.requireNonNull(handle.receiverType.cast(holder)),
|
||||
handle.fieldOffset,
|
||||
{#if[Object]?handle.fieldType.cast(expected):expected},
|
||||
{#if[Object]?handle.fieldType.cast(value):value});
|
||||
@ -347,8 +346,7 @@ final class VarHandle$Type$s {
|
||||
|
||||
@ForceInline
|
||||
static boolean weakCompareAndSetVolatile(FieldStaticReadWrite handle, $type$ expected, $type$ value) {
|
||||
// TODO defer to strong form until new Unsafe method is added
|
||||
return UNSAFE.compareAndSwap$Type$(handle.base,
|
||||
return UNSAFE.weakCompareAndSwap$Type$Volatile(handle.base,
|
||||
handle.fieldOffset,
|
||||
{#if[Object]?handle.fieldType.cast(expected):expected},
|
||||
{#if[Object]?handle.fieldType.cast(value):value});
|
||||
@ -583,8 +581,7 @@ final class VarHandle$Type$s {
|
||||
#else[Object]
|
||||
$type$[] array = ($type$[]) oarray;
|
||||
#end[Object]
|
||||
// TODO defer to strong form until new Unsafe method is added
|
||||
return UNSAFE.compareAndSwap$Type$(array,
|
||||
return UNSAFE.weakCompareAndSwap$Type$Volatile(array,
|
||||
(((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
||||
{#if[Object]?handle.componentType.cast(expected):expected},
|
||||
{#if[Object]?handle.componentType.cast(value):value});
|
||||
|
@ -234,8 +234,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase {
|
||||
@ForceInline
|
||||
static boolean weakCompareAndSetVolatile(ArrayHandle handle, Object oba, int index, $type$ expected, $type$ value) {
|
||||
byte[] ba = (byte[]) oba;
|
||||
// TODO defer to strong form until new Unsafe method is added
|
||||
return UNSAFE.compareAndSwap$RawType$(
|
||||
return UNSAFE.weakCompareAndSwap$RawType$Volatile(
|
||||
ba,
|
||||
address(ba, index(ba, index)),
|
||||
convEndian(handle.be, expected), convEndian(handle.be, value));
|
||||
@ -467,8 +466,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase {
|
||||
@ForceInline
|
||||
static boolean weakCompareAndSetVolatile(ByteBufferHandle handle, Object obb, int index, $type$ expected, $type$ value) {
|
||||
ByteBuffer bb = (ByteBuffer) obb;
|
||||
// TODO defer to strong form until new Unsafe method is added
|
||||
return UNSAFE.compareAndSwap$RawType$(
|
||||
return UNSAFE.weakCompareAndSwap$RawType$Volatile(
|
||||
UNSAFE.getObject(bb, BYTE_BUFFER_HB),
|
||||
address(bb, indexRO(bb, index)),
|
||||
convEndian(handle.be, expected), convEndian(handle.be, value));
|
||||
|
@ -105,6 +105,7 @@ public class VarHandleTestAccessInt extends VarHandleBaseTest {
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_VOLATILE));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
|
||||
@ -431,12 +432,22 @@ public class VarHandleTestAccessInt extends VarHandleBaseTest {
|
||||
assertEquals(x, 2, "weakCompareAndSetRelease int");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = vh.weakCompareAndSetVolatile(recv, 2, 1);
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile int");
|
||||
int x = (int) vh.get(recv);
|
||||
assertEquals(x, 1, "weakCompareAndSetVolatile int value");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
int o = (int) vh.getAndSet(recv, 1);
|
||||
assertEquals(o, 2, "getAndSet int");
|
||||
int o = (int) vh.getAndSet(recv, 2);
|
||||
assertEquals(o, 1, "getAndSet int");
|
||||
int x = (int) vh.get(recv);
|
||||
assertEquals(x, 1, "getAndSet int value");
|
||||
assertEquals(x, 2, "getAndSet int value");
|
||||
}
|
||||
|
||||
vh.set(recv, 1);
|
||||
@ -574,12 +585,22 @@ public class VarHandleTestAccessInt extends VarHandleBaseTest {
|
||||
assertEquals(x, 2, "weakCompareAndSetRelease int");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = vh.weakCompareAndSetRelease(2, 1);
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile int");
|
||||
int x = (int) vh.get();
|
||||
assertEquals(x, 1, "weakCompareAndSetVolatile int");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
int o = (int) vh.getAndSet( 1);
|
||||
assertEquals(o, 2, "getAndSet int");
|
||||
int o = (int) vh.getAndSet(2);
|
||||
assertEquals(o, 1, "getAndSet int");
|
||||
int x = (int) vh.get();
|
||||
assertEquals(x, 1, "getAndSet int value");
|
||||
assertEquals(x, 2, "getAndSet int value");
|
||||
}
|
||||
|
||||
vh.set(1);
|
||||
@ -720,12 +741,22 @@ public class VarHandleTestAccessInt extends VarHandleBaseTest {
|
||||
assertEquals(x, 2, "weakCompareAndSetRelease int");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = vh.weakCompareAndSetVolatile(array, i, 2, 1);
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile int");
|
||||
int x = (int) vh.get(array, i);
|
||||
assertEquals(x, 1, "weakCompareAndSetVolatile int");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
int o = (int) vh.getAndSet(array, i, 1);
|
||||
assertEquals(o, 2, "getAndSet int");
|
||||
int o = (int) vh.getAndSet(array, i, 2);
|
||||
assertEquals(o, 1, "getAndSet int");
|
||||
int x = (int) vh.get(array, i);
|
||||
assertEquals(x, 1, "getAndSet int value");
|
||||
assertEquals(x, 2, "getAndSet int value");
|
||||
}
|
||||
|
||||
vh.set(array, i, 1);
|
||||
@ -805,6 +836,10 @@ public class VarHandleTestAccessInt extends VarHandleBaseTest {
|
||||
boolean r = vh.weakCompareAndSet(array, ci, 1, 2);
|
||||
});
|
||||
|
||||
checkIOOBE(() -> {
|
||||
boolean r = vh.weakCompareAndSetVolatile(array, ci, 1, 2);
|
||||
});
|
||||
|
||||
checkIOOBE(() -> {
|
||||
boolean r = vh.weakCompareAndSetAcquire(array, ci, 1, 2);
|
||||
});
|
||||
|
@ -105,6 +105,7 @@ public class VarHandleTestAccessLong extends VarHandleBaseTest {
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_VOLATILE));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
|
||||
@ -431,12 +432,22 @@ public class VarHandleTestAccessLong extends VarHandleBaseTest {
|
||||
assertEquals(x, 2L, "weakCompareAndSetRelease long");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = vh.weakCompareAndSetVolatile(recv, 2L, 1L);
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile long");
|
||||
long x = (long) vh.get(recv);
|
||||
assertEquals(x, 1L, "weakCompareAndSetVolatile long value");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
long o = (long) vh.getAndSet(recv, 1L);
|
||||
assertEquals(o, 2L, "getAndSet long");
|
||||
long o = (long) vh.getAndSet(recv, 2L);
|
||||
assertEquals(o, 1L, "getAndSet long");
|
||||
long x = (long) vh.get(recv);
|
||||
assertEquals(x, 1L, "getAndSet long value");
|
||||
assertEquals(x, 2L, "getAndSet long value");
|
||||
}
|
||||
|
||||
vh.set(recv, 1L);
|
||||
@ -574,12 +585,22 @@ public class VarHandleTestAccessLong extends VarHandleBaseTest {
|
||||
assertEquals(x, 2L, "weakCompareAndSetRelease long");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = vh.weakCompareAndSetRelease(2L, 1L);
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile long");
|
||||
long x = (long) vh.get();
|
||||
assertEquals(x, 1L, "weakCompareAndSetVolatile long");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
long o = (long) vh.getAndSet( 1L);
|
||||
assertEquals(o, 2L, "getAndSet long");
|
||||
long o = (long) vh.getAndSet(2L);
|
||||
assertEquals(o, 1L, "getAndSet long");
|
||||
long x = (long) vh.get();
|
||||
assertEquals(x, 1L, "getAndSet long value");
|
||||
assertEquals(x, 2L, "getAndSet long value");
|
||||
}
|
||||
|
||||
vh.set(1L);
|
||||
@ -720,12 +741,22 @@ public class VarHandleTestAccessLong extends VarHandleBaseTest {
|
||||
assertEquals(x, 2L, "weakCompareAndSetRelease long");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = vh.weakCompareAndSetVolatile(array, i, 2L, 1L);
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile long");
|
||||
long x = (long) vh.get(array, i);
|
||||
assertEquals(x, 1L, "weakCompareAndSetVolatile long");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
long o = (long) vh.getAndSet(array, i, 1L);
|
||||
assertEquals(o, 2L, "getAndSet long");
|
||||
long o = (long) vh.getAndSet(array, i, 2L);
|
||||
assertEquals(o, 1L, "getAndSet long");
|
||||
long x = (long) vh.get(array, i);
|
||||
assertEquals(x, 1L, "getAndSet long value");
|
||||
assertEquals(x, 2L, "getAndSet long value");
|
||||
}
|
||||
|
||||
vh.set(array, i, 1L);
|
||||
@ -805,6 +836,10 @@ public class VarHandleTestAccessLong extends VarHandleBaseTest {
|
||||
boolean r = vh.weakCompareAndSet(array, ci, 1L, 2L);
|
||||
});
|
||||
|
||||
checkIOOBE(() -> {
|
||||
boolean r = vh.weakCompareAndSetVolatile(array, ci, 1L, 2L);
|
||||
});
|
||||
|
||||
checkIOOBE(() -> {
|
||||
boolean r = vh.weakCompareAndSetAcquire(array, ci, 1L, 2L);
|
||||
});
|
||||
|
@ -105,6 +105,7 @@ public class VarHandleTestAccessString extends VarHandleBaseTest {
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_VOLATILE));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
|
||||
@ -445,12 +446,22 @@ public class VarHandleTestAccessString extends VarHandleBaseTest {
|
||||
assertEquals(x, "bar", "weakCompareAndSetRelease String");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = vh.weakCompareAndSetVolatile(recv, "bar", "foo");
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile String");
|
||||
String x = (String) vh.get(recv);
|
||||
assertEquals(x, "foo", "weakCompareAndSetVolatile String value");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
String o = (String) vh.getAndSet(recv, "foo");
|
||||
assertEquals(o, "bar", "getAndSet String");
|
||||
String o = (String) vh.getAndSet(recv, "bar");
|
||||
assertEquals(o, "foo", "getAndSet String");
|
||||
String x = (String) vh.get(recv);
|
||||
assertEquals(x, "foo", "getAndSet String value");
|
||||
assertEquals(x, "bar", "getAndSet String value");
|
||||
}
|
||||
|
||||
}
|
||||
@ -586,12 +597,22 @@ public class VarHandleTestAccessString extends VarHandleBaseTest {
|
||||
assertEquals(x, "bar", "weakCompareAndSetRelease String");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = vh.weakCompareAndSetRelease("bar", "foo");
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile String");
|
||||
String x = (String) vh.get();
|
||||
assertEquals(x, "foo", "weakCompareAndSetVolatile String");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
String o = (String) vh.getAndSet( "foo");
|
||||
assertEquals(o, "bar", "getAndSet String");
|
||||
String o = (String) vh.getAndSet("bar");
|
||||
assertEquals(o, "foo", "getAndSet String");
|
||||
String x = (String) vh.get();
|
||||
assertEquals(x, "foo", "getAndSet String value");
|
||||
assertEquals(x, "bar", "getAndSet String value");
|
||||
}
|
||||
|
||||
}
|
||||
@ -730,12 +751,22 @@ public class VarHandleTestAccessString extends VarHandleBaseTest {
|
||||
assertEquals(x, "bar", "weakCompareAndSetRelease String");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = vh.weakCompareAndSetVolatile(array, i, "bar", "foo");
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile String");
|
||||
String x = (String) vh.get(array, i);
|
||||
assertEquals(x, "foo", "weakCompareAndSetVolatile String");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
String o = (String) vh.getAndSet(array, i, "foo");
|
||||
assertEquals(o, "bar", "getAndSet String");
|
||||
String o = (String) vh.getAndSet(array, i, "bar");
|
||||
assertEquals(o, "foo", "getAndSet String");
|
||||
String x = (String) vh.get(array, i);
|
||||
assertEquals(x, "foo", "getAndSet String value");
|
||||
assertEquals(x, "bar", "getAndSet String value");
|
||||
}
|
||||
|
||||
}
|
||||
@ -813,6 +844,10 @@ public class VarHandleTestAccessString extends VarHandleBaseTest {
|
||||
boolean r = vh.weakCompareAndSet(array, ci, "foo", "bar");
|
||||
});
|
||||
|
||||
checkIOOBE(() -> {
|
||||
boolean r = vh.weakCompareAndSetVolatile(array, ci, "foo", "bar");
|
||||
});
|
||||
|
||||
checkIOOBE(() -> {
|
||||
boolean r = vh.weakCompareAndSetAcquire(array, ci, "foo", "bar");
|
||||
});
|
||||
|
@ -238,12 +238,22 @@ public class VarHandleTestMethodHandleAccessInt extends VarHandleBaseTest {
|
||||
assertEquals(x, 2, "weakCompareAndSetRelease int");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(recv, 2, 1);
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile int");
|
||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||
assertEquals(x, 1, "weakCompareAndSetVolatile int");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 1);
|
||||
assertEquals(o, 2, "getAndSet int");
|
||||
int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 2);
|
||||
assertEquals(o, 1, "getAndSet int");
|
||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||
assertEquals(x, 1, "getAndSet int value");
|
||||
assertEquals(x, 2, "getAndSet int value");
|
||||
}
|
||||
|
||||
hs.get(TestAccessMode.SET).invokeExact(recv, 1);
|
||||
@ -381,12 +391,22 @@ public class VarHandleTestMethodHandleAccessInt extends VarHandleBaseTest {
|
||||
assertEquals(x, 2, "weakCompareAndSetRelease int");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(2, 1);
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile int");
|
||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact();
|
||||
assertEquals(x, 1, "weakCompareAndSetVolatile int");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact( 1);
|
||||
assertEquals(o, 2, "getAndSet int");
|
||||
int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact( 2);
|
||||
assertEquals(o, 1, "getAndSet int");
|
||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact();
|
||||
assertEquals(x, 1, "getAndSet int value");
|
||||
assertEquals(x, 2, "getAndSet int value");
|
||||
}
|
||||
|
||||
hs.get(TestAccessMode.SET).invokeExact(1);
|
||||
@ -527,12 +547,22 @@ public class VarHandleTestMethodHandleAccessInt extends VarHandleBaseTest {
|
||||
assertEquals(x, 2, "weakCompareAndSetRelease int");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(array, i, 2, 1);
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile int");
|
||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||
assertEquals(x, 1, "weakCompareAndSetVolatile int");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 1);
|
||||
assertEquals(o, 2, "getAndSet int");
|
||||
int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 2);
|
||||
assertEquals(o, 1, "getAndSet int");
|
||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||
assertEquals(x, 1, "getAndSet int value");
|
||||
assertEquals(x, 2, "getAndSet int value");
|
||||
}
|
||||
|
||||
hs.get(TestAccessMode.SET).invokeExact(array, i, 1);
|
||||
|
@ -238,12 +238,22 @@ public class VarHandleTestMethodHandleAccessLong extends VarHandleBaseTest {
|
||||
assertEquals(x, 2L, "weakCompareAndSetRelease long");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(recv, 2L, 1L);
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile long");
|
||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||
assertEquals(x, 1L, "weakCompareAndSetVolatile long");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 1L);
|
||||
assertEquals(o, 2L, "getAndSet long");
|
||||
long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 2L);
|
||||
assertEquals(o, 1L, "getAndSet long");
|
||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||
assertEquals(x, 1L, "getAndSet long value");
|
||||
assertEquals(x, 2L, "getAndSet long value");
|
||||
}
|
||||
|
||||
hs.get(TestAccessMode.SET).invokeExact(recv, 1L);
|
||||
@ -381,12 +391,22 @@ public class VarHandleTestMethodHandleAccessLong extends VarHandleBaseTest {
|
||||
assertEquals(x, 2L, "weakCompareAndSetRelease long");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(2L, 1L);
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile long");
|
||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact();
|
||||
assertEquals(x, 1L, "weakCompareAndSetVolatile long");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact( 1L);
|
||||
assertEquals(o, 2L, "getAndSet long");
|
||||
long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact( 2L);
|
||||
assertEquals(o, 1L, "getAndSet long");
|
||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact();
|
||||
assertEquals(x, 1L, "getAndSet long value");
|
||||
assertEquals(x, 2L, "getAndSet long value");
|
||||
}
|
||||
|
||||
hs.get(TestAccessMode.SET).invokeExact(1L);
|
||||
@ -527,12 +547,22 @@ public class VarHandleTestMethodHandleAccessLong extends VarHandleBaseTest {
|
||||
assertEquals(x, 2L, "weakCompareAndSetRelease long");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(array, i, 2L, 1L);
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile long");
|
||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||
assertEquals(x, 1L, "weakCompareAndSetVolatile long");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 1L);
|
||||
assertEquals(o, 2L, "getAndSet long");
|
||||
long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 2L);
|
||||
assertEquals(o, 1L, "getAndSet long");
|
||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||
assertEquals(x, 1L, "getAndSet long value");
|
||||
assertEquals(x, 2L, "getAndSet long value");
|
||||
}
|
||||
|
||||
hs.get(TestAccessMode.SET).invokeExact(array, i, 1L);
|
||||
|
@ -238,12 +238,22 @@ public class VarHandleTestMethodHandleAccessString extends VarHandleBaseTest {
|
||||
assertEquals(x, "bar", "weakCompareAndSetRelease String");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(recv, "bar", "foo");
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile String");
|
||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||
assertEquals(x, "foo", "weakCompareAndSetVolatile String");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, "foo");
|
||||
assertEquals(o, "bar", "getAndSet String");
|
||||
String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, "bar");
|
||||
assertEquals(o, "foo", "getAndSet String");
|
||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||
assertEquals(x, "foo", "getAndSet String value");
|
||||
assertEquals(x, "bar", "getAndSet String value");
|
||||
}
|
||||
|
||||
}
|
||||
@ -377,12 +387,22 @@ public class VarHandleTestMethodHandleAccessString extends VarHandleBaseTest {
|
||||
assertEquals(x, "bar", "weakCompareAndSetRelease String");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact("bar", "foo");
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile String");
|
||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact();
|
||||
assertEquals(x, "foo", "weakCompareAndSetVolatile String");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact( "foo");
|
||||
assertEquals(o, "bar", "getAndSet String");
|
||||
String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact( "bar");
|
||||
assertEquals(o, "foo", "getAndSet String");
|
||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact();
|
||||
assertEquals(x, "foo", "getAndSet String value");
|
||||
assertEquals(x, "bar", "getAndSet String value");
|
||||
}
|
||||
|
||||
}
|
||||
@ -519,12 +539,22 @@ public class VarHandleTestMethodHandleAccessString extends VarHandleBaseTest {
|
||||
assertEquals(x, "bar", "weakCompareAndSetRelease String");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(array, i, "bar", "foo");
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile String");
|
||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||
assertEquals(x, "foo", "weakCompareAndSetVolatile String");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, "foo");
|
||||
assertEquals(o, "bar", "getAndSet String");
|
||||
String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, "bar");
|
||||
assertEquals(o, "foo", "getAndSet String");
|
||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||
assertEquals(x, "foo", "getAndSet String value");
|
||||
assertEquals(x, "bar", "getAndSet String value");
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -106,6 +106,7 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_VOLATILE));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
|
||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
|
||||
@ -115,6 +116,7 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
||||
assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
|
||||
assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
|
||||
assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
|
||||
assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_VOLATILE));
|
||||
assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
|
||||
assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
|
||||
assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
|
||||
@ -297,6 +299,10 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
||||
boolean r = vh.weakCompareAndSet(recv, $value1$, $value2$);
|
||||
});
|
||||
|
||||
checkUOE(() -> {
|
||||
boolean r = vh.weakCompareAndSetVolatile(recv, $value1$, $value2$);
|
||||
});
|
||||
|
||||
checkUOE(() -> {
|
||||
boolean r = vh.weakCompareAndSetAcquire(recv, $value1$, $value2$);
|
||||
});
|
||||
@ -387,6 +393,10 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
||||
boolean r = vh.weakCompareAndSet($value1$, $value2$);
|
||||
});
|
||||
|
||||
checkUOE(() -> {
|
||||
boolean r = vh.weakCompareAndSetVolatile($value1$, $value2$);
|
||||
});
|
||||
|
||||
checkUOE(() -> {
|
||||
boolean r = vh.weakCompareAndSetAcquire($value1$, $value2$);
|
||||
});
|
||||
@ -532,12 +542,22 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
||||
assertEquals(x, $value2$, "weakCompareAndSetRelease $type$");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = vh.weakCompareAndSetVolatile(recv, $value2$, $value1$);
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile $type$");
|
||||
$type$ x = ($type$) vh.get(recv);
|
||||
assertEquals(x, $value1$, "weakCompareAndSetVolatile $type$ value");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
$type$ o = ($type$) vh.getAndSet(recv, $value1$);
|
||||
assertEquals(o, $value2$, "getAndSet $type$");
|
||||
$type$ o = ($type$) vh.getAndSet(recv, $value2$);
|
||||
assertEquals(o, $value1$, "getAndSet $type$");
|
||||
$type$ x = ($type$) vh.get(recv);
|
||||
assertEquals(x, $value1$, "getAndSet $type$ value");
|
||||
assertEquals(x, $value2$, "getAndSet $type$ value");
|
||||
}
|
||||
#end[CAS]
|
||||
|
||||
@ -576,6 +596,10 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
||||
boolean r = vh.weakCompareAndSet(recv, $value1$, $value2$);
|
||||
});
|
||||
|
||||
checkUOE(() -> {
|
||||
boolean r = vh.weakCompareAndSetVolatile(recv, $value1$, $value2$);
|
||||
});
|
||||
|
||||
checkUOE(() -> {
|
||||
boolean r = vh.weakCompareAndSetAcquire(recv, $value1$, $value2$);
|
||||
});
|
||||
@ -721,12 +745,22 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
||||
assertEquals(x, $value2$, "weakCompareAndSetRelease $type$");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = vh.weakCompareAndSetRelease($value2$, $value1$);
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile $type$");
|
||||
$type$ x = ($type$) vh.get();
|
||||
assertEquals(x, $value1$, "weakCompareAndSetVolatile $type$");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
$type$ o = ($type$) vh.getAndSet( $value1$);
|
||||
assertEquals(o, $value2$, "getAndSet $type$");
|
||||
$type$ o = ($type$) vh.getAndSet($value2$);
|
||||
assertEquals(o, $value1$, "getAndSet $type$");
|
||||
$type$ x = ($type$) vh.get();
|
||||
assertEquals(x, $value1$, "getAndSet $type$ value");
|
||||
assertEquals(x, $value2$, "getAndSet $type$ value");
|
||||
}
|
||||
#end[CAS]
|
||||
|
||||
@ -765,6 +799,10 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
||||
boolean r = vh.weakCompareAndSet($value1$, $value2$);
|
||||
});
|
||||
|
||||
checkUOE(() -> {
|
||||
boolean r = vh.weakCompareAndSetVolatile($value1$, $value2$);
|
||||
});
|
||||
|
||||
checkUOE(() -> {
|
||||
boolean r = vh.weakCompareAndSetAcquire($value1$, $value2$);
|
||||
});
|
||||
@ -913,12 +951,22 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
||||
assertEquals(x, $value2$, "weakCompareAndSetRelease $type$");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = vh.weakCompareAndSetVolatile(array, i, $value2$, $value1$);
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile $type$");
|
||||
$type$ x = ($type$) vh.get(array, i);
|
||||
assertEquals(x, $value1$, "weakCompareAndSetVolatile $type$");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
$type$ o = ($type$) vh.getAndSet(array, i, $value1$);
|
||||
assertEquals(o, $value2$, "getAndSet $type$");
|
||||
$type$ o = ($type$) vh.getAndSet(array, i, $value2$);
|
||||
assertEquals(o, $value1$, "getAndSet $type$");
|
||||
$type$ x = ($type$) vh.get(array, i);
|
||||
assertEquals(x, $value1$, "getAndSet $type$ value");
|
||||
assertEquals(x, $value2$, "getAndSet $type$ value");
|
||||
}
|
||||
#end[CAS]
|
||||
|
||||
@ -961,6 +1009,10 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
||||
boolean r = vh.weakCompareAndSet(array, i, $value1$, $value2$);
|
||||
});
|
||||
|
||||
checkUOE(() -> {
|
||||
boolean r = vh.weakCompareAndSetVolatile(array, i, $value1$, $value2$);
|
||||
});
|
||||
|
||||
checkUOE(() -> {
|
||||
boolean r = vh.weakCompareAndSetAcquire(array, i, $value1$, $value2$);
|
||||
});
|
||||
@ -1044,6 +1096,10 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
||||
boolean r = vh.weakCompareAndSet(array, ci, $value1$, $value2$);
|
||||
});
|
||||
|
||||
checkIOOBE(() -> {
|
||||
boolean r = vh.weakCompareAndSetVolatile(array, ci, $value1$, $value2$);
|
||||
});
|
||||
|
||||
checkIOOBE(() -> {
|
||||
boolean r = vh.weakCompareAndSetAcquire(array, ci, $value1$, $value2$);
|
||||
});
|
||||
|
@ -239,12 +239,22 @@ public class VarHandleTestMethodHandleAccess$Type$ extends VarHandleBaseTest {
|
||||
assertEquals(x, $value2$, "weakCompareAndSetRelease $type$");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(recv, $value2$, $value1$);
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile $type$");
|
||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||
assertEquals(x, $value1$, "weakCompareAndSetVolatile $type$");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
$type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, $value1$);
|
||||
assertEquals(o, $value2$, "getAndSet $type$");
|
||||
$type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, $value2$);
|
||||
assertEquals(o, $value1$, "getAndSet $type$");
|
||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||
assertEquals(x, $value1$, "getAndSet $type$ value");
|
||||
assertEquals(x, $value2$, "getAndSet $type$ value");
|
||||
}
|
||||
#end[CAS]
|
||||
|
||||
@ -412,12 +422,22 @@ public class VarHandleTestMethodHandleAccess$Type$ extends VarHandleBaseTest {
|
||||
assertEquals(x, $value2$, "weakCompareAndSetRelease $type$");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact($value2$, $value1$);
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile $type$");
|
||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
|
||||
assertEquals(x, $value1$, "weakCompareAndSetVolatile $type$");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
$type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact( $value1$);
|
||||
assertEquals(o, $value2$, "getAndSet $type$");
|
||||
$type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact( $value2$);
|
||||
assertEquals(o, $value1$, "getAndSet $type$");
|
||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
|
||||
assertEquals(x, $value1$, "getAndSet $type$ value");
|
||||
assertEquals(x, $value2$, "getAndSet $type$ value");
|
||||
}
|
||||
#end[CAS]
|
||||
|
||||
@ -588,12 +608,22 @@ public class VarHandleTestMethodHandleAccess$Type$ extends VarHandleBaseTest {
|
||||
assertEquals(x, $value2$, "weakCompareAndSetRelease $type$");
|
||||
}
|
||||
|
||||
{
|
||||
boolean success = false;
|
||||
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(array, i, $value2$, $value1$);
|
||||
}
|
||||
assertEquals(success, true, "weakCompareAndSetVolatile $type$");
|
||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||
assertEquals(x, $value1$, "weakCompareAndSetVolatile $type$");
|
||||
}
|
||||
|
||||
// Compare set and get
|
||||
{
|
||||
$type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, $value1$);
|
||||
assertEquals(o, $value2$, "getAndSet $type$");
|
||||
$type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, $value2$);
|
||||
assertEquals(o, $value1$, "getAndSet $type$");
|
||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||
assertEquals(x, $value1$, "getAndSet $type$ value");
|
||||
assertEquals(x, $value2$, "getAndSet $type$ value");
|
||||
}
|
||||
#end[CAS]
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user