Hi,
Please review the simple patch below.
As spotted by Andrew Haley the Unsafe.compareAndExchangeDouble/FloatAcquire
methods were incorrectly deferring to compareAndExchangeLong/IntVolatile rather
than compareAndExchangeLong/IntAcquire. Other, related, double/float Unsafe
methods defer correctly to the long/int variants.
Thanks,
Paul.
diff -r 7ca81adc8bad src/java.base/share/classes/jdk/internal/misc/Unsafe.java
--- a/src/java.base/share/classes/jdk/internal/misc/Unsafe.java Wed Jul 06
17:38:29 2016 +0200
+++ b/src/java.base/share/classes/jdk/internal/misc/Unsafe.java Wed Jul 06
19:08:55 2016 +0200
@@ -1709,9 +1709,9 @@
public final float compareAndExchangeFloatAcquire(Object o, long offset,
float expected,
float x) {
- int w = compareAndExchangeIntVolatile(o, offset,
-
Float.floatToRawIntBits(expected),
- Float.floatToRawIntBits(x));
+ int w = compareAndExchangeIntAcquire(o, offset,
+ Float.floatToRawIntBits(expected),
+ Float.floatToRawIntBits(x));
return Float.intBitsToFloat(w);
}
@@ -1793,9 +1793,9 @@
public final double compareAndExchangeDoubleAcquire(Object o, long offset,
double expected,
double x) {
- long w = compareAndExchangeLongVolatile(o, offset,
-
Double.doubleToRawLongBits(expected),
- Double.doubleToRawLongBits(x));
+ long w = compareAndExchangeLongAcquire(o, offset,
+
Double.doubleToRawLongBits(expected),
+ Double.doubleToRawLongBits(x));
return Double.longBitsToDouble(w);
}