8157171: Hook up Unsafe.weakCompareAndSetVolatile to VarHandles

Reviewed-by: psandoz, redestad
This commit is contained in:
Aleksey Shipilev 2016-05-17 22:28:00 +03:00
parent f8157334a8
commit 33bb9220fc
10 changed files with 358 additions and 82 deletions

View File

@ -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});

View File

@ -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));

View File

@ -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);
});

View File

@ -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);
});

View File

@ -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");
});

View File

@ -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);

View File

@ -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);

View File

@ -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");
}
}

View File

@ -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$);
});

View File

@ -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]