8157171: Hook up Unsafe.weakCompareAndSetVolatile to VarHandles
Reviewed-by: psandoz, redestad
--- a/jdk/src/java.base/share/classes/java/lang/invoke/X-VarHandle.java.template Tue May 03 15:35:39 2016 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/X-VarHandle.java.template Tue May 17 22:28:00 2016 +0300
@@ -165,8 +165,7 @@
@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 @@
@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 @@
#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});
--- a/jdk/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template Tue May 03 15:35:39 2016 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template Tue May 17 22:28:00 2016 +0300
@@ -234,8 +234,7 @@
@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 @@
@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));
--- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessInt.java Tue May 03 15:35:39 2016 +0200
+++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessInt.java Tue May 17 22:28:00 2016 +0300
@@ -105,6 +105,7 @@
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 @@
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 @@
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 @@
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);
@@ -806,6 +837,10 @@
});
checkIOOBE(() -> {
+ boolean r = vh.weakCompareAndSetVolatile(array, ci, 1, 2);
+ });
+
+ checkIOOBE(() -> {
boolean r = vh.weakCompareAndSetAcquire(array, ci, 1, 2);
});
--- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessLong.java Tue May 03 15:35:39 2016 +0200
+++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessLong.java Tue May 17 22:28:00 2016 +0300
@@ -105,6 +105,7 @@
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 @@
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 @@
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 @@
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);
@@ -806,6 +837,10 @@
});
checkIOOBE(() -> {
+ boolean r = vh.weakCompareAndSetVolatile(array, ci, 1L, 2L);
+ });
+
+ checkIOOBE(() -> {
boolean r = vh.weakCompareAndSetAcquire(array, ci, 1L, 2L);
});
--- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessString.java Tue May 03 15:35:39 2016 +0200
+++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessString.java Tue May 17 22:28:00 2016 +0300
@@ -105,6 +105,7 @@
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 @@
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 @@
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 @@
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");
}
}
@@ -814,6 +845,10 @@
});
checkIOOBE(() -> {
+ boolean r = vh.weakCompareAndSetVolatile(array, ci, "foo", "bar");
+ });
+
+ checkIOOBE(() -> {
boolean r = vh.weakCompareAndSetAcquire(array, ci, "foo", "bar");
});
--- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessInt.java Tue May 03 15:35:39 2016 +0200
+++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessInt.java Tue May 17 22:28:00 2016 +0300
@@ -238,12 +238,22 @@
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 @@
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 @@
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);
--- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessLong.java Tue May 03 15:35:39 2016 +0200
+++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessLong.java Tue May 17 22:28:00 2016 +0300
@@ -238,12 +238,22 @@
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 @@
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 @@
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);
--- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessString.java Tue May 03 15:35:39 2016 +0200
+++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessString.java Tue May 17 22:28:00 2016 +0300
@@ -238,12 +238,22 @@
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 @@
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 @@
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");
}
}
--- a/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestAccess.java.template Tue May 03 15:35:39 2016 +0200
+++ b/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestAccess.java.template Tue May 17 22:28:00 2016 +0300
@@ -106,6 +106,7 @@
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 @@
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));
@@ -298,6 +300,10 @@
});
checkUOE(() -> {
+ boolean r = vh.weakCompareAndSetVolatile(recv, $value1$, $value2$);
+ });
+
+ checkUOE(() -> {
boolean r = vh.weakCompareAndSetAcquire(recv, $value1$, $value2$);
});
@@ -388,6 +394,10 @@
});
checkUOE(() -> {
+ boolean r = vh.weakCompareAndSetVolatile($value1$, $value2$);
+ });
+
+ checkUOE(() -> {
boolean r = vh.weakCompareAndSetAcquire($value1$, $value2$);
});
@@ -532,12 +542,22 @@
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]
@@ -577,6 +597,10 @@
});
checkUOE(() -> {
+ boolean r = vh.weakCompareAndSetVolatile(recv, $value1$, $value2$);
+ });
+
+ checkUOE(() -> {
boolean r = vh.weakCompareAndSetAcquire(recv, $value1$, $value2$);
});
@@ -721,12 +745,22 @@
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]
@@ -766,6 +800,10 @@
});
checkUOE(() -> {
+ boolean r = vh.weakCompareAndSetVolatile($value1$, $value2$);
+ });
+
+ checkUOE(() -> {
boolean r = vh.weakCompareAndSetAcquire($value1$, $value2$);
});
@@ -913,12 +951,22 @@
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]
@@ -962,6 +1010,10 @@
});
checkUOE(() -> {
+ boolean r = vh.weakCompareAndSetVolatile(array, i, $value1$, $value2$);
+ });
+
+ checkUOE(() -> {
boolean r = vh.weakCompareAndSetAcquire(array, i, $value1$, $value2$);
});
@@ -1045,6 +1097,10 @@
});
checkIOOBE(() -> {
+ boolean r = vh.weakCompareAndSetVolatile(array, ci, $value1$, $value2$);
+ });
+
+ checkIOOBE(() -> {
boolean r = vh.weakCompareAndSetAcquire(array, ci, $value1$, $value2$);
});
--- a/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestMethodHandleAccess.java.template Tue May 03 15:35:39 2016 +0200
+++ b/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestMethodHandleAccess.java.template Tue May 17 22:28:00 2016 +0300
@@ -239,12 +239,22 @@
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 @@
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 @@
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]