8154755: Add a VarHandle weakCompareAndSet with volatile semantics
Reviewed-by: shade, vlivanov
diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsLong.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsLong.java
index 263245a..a0cabc8 100644
--- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsLong.java
+++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsLong.java
@@ -93,6 +93,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));
@@ -232,6 +233,10 @@
});
checkROBE(() -> {
+ boolean r = vh.weakCompareAndSetVolatile(array, ci, VALUE_1, VALUE_2);
+ });
+
+ checkROBE(() -> {
boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
});
@@ -320,6 +325,10 @@
});
checkIOOBE(() -> {
+ boolean r = vh.weakCompareAndSetVolatile(array, ci, VALUE_1, VALUE_2);
+ });
+
+ checkIOOBE(() -> {
boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
});
@@ -408,6 +417,10 @@
});
checkIOOBE(() -> {
+ boolean r = vh.weakCompareAndSetVolatile(array, ci, VALUE_1, VALUE_2);
+ });
+
+ checkIOOBE(() -> {
boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
});
@@ -487,6 +500,10 @@
});
checkISE(() -> {
+ boolean r = vh.weakCompareAndSetVolatile(array, ci, VALUE_1, VALUE_2);
+ });
+
+ checkISE(() -> {
boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
});
@@ -569,6 +586,10 @@
});
checkISE(() -> {
+ boolean r = vh.weakCompareAndSetVolatile(array, ci, VALUE_1, VALUE_2);
+ });
+
+ checkISE(() -> {
boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
});
@@ -713,12 +734,19 @@
assertEquals(x, VALUE_2, "weakCompareAndSetRelease long");
}
+ {
+ boolean r = vh.weakCompareAndSetVolatile(array, i, VALUE_2, VALUE_1);
+ assertEquals(r, true, "weakCompareAndSetVolatile long");
+ long x = (long) vh.get(array, i);
+ assertEquals(x, VALUE_1, "weakCompareAndSetVolatile long value");
+ }
+
// Compare set and get
{
- long o = (long) vh.getAndSet(array, i, VALUE_1);
- assertEquals(o, VALUE_2, "getAndSet long");
+ long o = (long) vh.getAndSet(array, i, VALUE_2);
+ assertEquals(o, VALUE_1, "getAndSet long");
long x = (long) vh.get(array, i);
- assertEquals(x, VALUE_1, "getAndSet long value");
+ assertEquals(x, VALUE_2, "getAndSet long value");
}
vh.set(array, i, VALUE_1);
@@ -855,12 +883,19 @@
assertEquals(x, VALUE_2, "weakCompareAndSetRelease long");
}
+ {
+ boolean r = vh.weakCompareAndSetVolatile(array, i, VALUE_2, VALUE_1);
+ assertEquals(r, true, "weakCompareAndSetVolatile long");
+ long x = (long) vh.get(array, i);
+ assertEquals(x, VALUE_1, "weakCompareAndSetVolatile long value");
+ }
+
// Compare set and get
{
- long o = (long) vh.getAndSet(array, i, VALUE_1);
- assertEquals(o, VALUE_2, "getAndSet long");
+ long o = (long) vh.getAndSet(array, i, VALUE_2);
+ assertEquals(o, VALUE_1, "getAndSet long");
long x = (long) vh.get(array, i);
- assertEquals(x, VALUE_1, "getAndSet long value");
+ assertEquals(x, VALUE_2, "getAndSet long value");
}
vh.set(array, i, VALUE_1);