Unsafe compareAnd*
    Paul Sandoz 
    paul.sandoz at oracle.com
       
    Thu Nov 17 18:48:50 UTC 2016
    
    
  
Hi Trevor,
The compareAndSwapShort (non-instrinsic) implementation defers to the compareAndExchangeShortVolatile implementation, and the weakCompareAndSwapShortVolatile implementation defers to (the stronger) compareAndSwapShort implementation [*]:
i.e. weakCompareAndSwapShortVolatile -> compareAndSwapShort -> compareAndExchangeShortVolatile
@HotSpotIntrinsicCandidate
public final short compareAndExchangeShortVolatile(Object o, long offset,
                                         short expected,
                                         short x) {
    if ((offset & 3) == 3) {
        throw new IllegalArgumentException("Update spans the word, not supported");
    }
    …
}
@HotSpotIntrinsicCandidate
public final boolean compareAndSwapShort(Object o, long offset,
                                         short expected,
                                         short x) {
    return compareAndExchangeShortVolatile(o, offset, expected, x) == expected;
}
@HotSpotIntrinsicCandidate
public final boolean weakCompareAndSwapShortVolatile(Object o, long offset,
                                                     short expected,
                                                     short x) {
    return compareAndSwapShort(o, offset, expected, x);
}
I think that explains why you are observing failing Unsafe.weakCompareAndSwapShort() tests.
Paul.
[*] Note, we really need to change the names here to be consistent with the schema on VarHandles
> On 17 Nov 2016, at 09:29, Trevor Watson <trevor.d.watson at oracle.com> wrote:
> 
> I'm working on an implementation of the C2 code for compareAndExchangeShort on SPARC.
> 
> I've only implemented this function so far, and no compareAndSwapShort equivalent.
> 
> When I run the test in hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestShort.java it fails because Unsafe.compareAndSwapShort() returns an incorrect value. This test passes without my implementation of compareAndExchangeShort.
> 
> If I comment out the Unsafe.compareAndSwapShort() tests, the Unsafe.compareAndExchangeShort tests run successfully but the Unsafe.weakCompareAndSwapShort() tests subsequently fail.
> 
> Can anyone tell me why it might be that an implementation for CompareAndExchangeS would trigger a failure in Unsafe.compareAndSwapShort()?
> 
> Thanks,
> Trevor
    
    
More information about the hotspot-dev
mailing list