Advice on finding out the cause of test failure of VarHandleTestAccessBoolean on windows x64

dean.long at oracle.com dean.long at oracle.com
Fri Aug 12 18:09:57 UTC 2016


Tobias, does this sound like 8038348?

dl


On 8/12/16 8:36 AM, Paul Sandoz wrote:
> Hi,
>
> Please can someone help/advice how to find the cause of a test failure i am observing.
>
> The patch for VarHandles bitwise operations [1] is failing for boolean, the test VarHandleTestAccessBoolean, but only on windows x64. I have observed it can reliably fail in different assertions when testing bitwise ops and AFAICT so far only for C2 (and definitely not in the interpreter).
>
> Here is an example:
>
>    // get and bitwise and
>    {
>        vh.set(true);
>
>        boolean o = (boolean) vh.getAndBitwiseAnd(false);
>        assertEquals(o, true, "getAndBitwiseAnd boolean”);  // <— PASSES for the previous value
>        boolean x = (boolean) vh.get();
>        assertEquals(x, (boolean)(true & false), "getAndBitwiseAnd boolean value”);  // <— FAILS for the updated value, expected false got true
>    }
>
>
> It appears as if the atomic read modify write of “vh.getAndBitwiseAnd" failed and when getting the value (“vh.get”) it reads the previous value.
>
> I don’t know what could be different about the windows x64 platform that such a bug could arise just on that platform.
>
>
> vh.set/set will defer to Unsafe.put/getBoolean, where as the vh.getAndBitwiseAnd will call:
>
>    @ForceInline
>    public final boolean getAndBitwiseAndBoolean(Object o, long offset, boolean mask) {
>        return byte2bool(getAndBitwiseAndByte(o, offset, bool2byte(mask)));
>    }
>
>    @ForceInline
>    public final byte getAndBitwiseAndByte(Object o, long offset, byte mask) {
>        byte current;
>        do {
>            current = getByteVolatile(o, offset);
>        } while (!weakCompareAndSwapByteVolatile(o, offset,
>                                                  current, (byte) (current & mask)));
>        return current;
>    }
>
> which defers to reading/writing the boolean as the VM byte representation. So there is a mismatch going on between T_BOOLEAN and T_BYTE but i gather that should not be an issue.
>
> If i disable the Unsafe _getByte and _getByteVolatile intrinsics the test passes.
>
> (I have yet to work out how to compile and use hdis on windows x64).
>
> Thanks,
> Paul.
>
> [1] http://cr.openjdk.java.net/~psandoz/jdk9/JDK-8161444-vhs-bitwise-atomics/webrev/
>



More information about the hotspot-dev mailing list