RFR: 8345119: Some java/foreign tests wrongly assume aligned memory

Quan Anh Mai qamai at openjdk.org
Wed Nov 27 17:00:38 UTC 2024


On Wed, 27 Nov 2024 16:41:39 GMT, Jorn Vernee <jvernee at openjdk.org> wrote:

>> Hi,
>> 
>> This patch resolves some issues I found that the tests wrongly assume sufficient alignment from the segment returned by `Arena::allocate`.
>> 
>> Please take a look and leave your reviews, thanks a lot.
>
> test/jdk/java/foreign/TestByteBuffer.java line 414:
> 
>> 412:         ByteBuffer bb;
>> 413:         try (Arena arena = Arena.ofConfined()) {
>> 414:             MemorySegment segment = arena.allocate(bytes, Long.BYTES);
> 
> Why does this segment need to be aligned?

Because the `bufferHandle` here iterates through all kinds of element types:

    @DataProvider(name = "bufferHandleOps")
    public static Object[][] bufferHandleOps() throws Throwable {
        return new Object[][]{
                { MethodHandles.byteBufferViewVarHandle(char[].class, ByteOrder.nativeOrder()) },
                { MethodHandles.byteBufferViewVarHandle(short[].class, ByteOrder.nativeOrder()) },
                { MethodHandles.byteBufferViewVarHandle(int[].class, ByteOrder.nativeOrder()) },
                { MethodHandles.byteBufferViewVarHandle(long[].class, ByteOrder.nativeOrder()) },
                { MethodHandles.byteBufferViewVarHandle(float[].class, ByteOrder.nativeOrder()) },
                { MethodHandles.byteBufferViewVarHandle(double[].class, ByteOrder.nativeOrder()) }

The test then does all kind of accesses on these:

    static Map<MethodHandle, Object[]> varHandleMembers(ByteBuffer bb, VarHandle handle) {
        Map<MethodHandle, Object[]> members = new HashMap<>();
        for (VarHandle.AccessMode mode : VarHandle.AccessMode.values()) {
            Class<?>[] params = handle.accessModeType(mode).parameterArray();
            Object[] args = Stream.concat(Stream.of(bb), Stream.of(params).skip(1)
                    .map(TestByteBuffer::defaultValue))
                    .toArray();
            try {
                members.put(MethodHandles.varHandleInvoker(mode, handle.accessModeType(mode)), args);
            } catch (Throwable ex) {
                throw new AssertionError(ex);
            }
        }
        return members;
    }

And for access other than plain `get` and `set`, the natural alignment is required.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/22415#discussion_r1860998302


More information about the core-libs-dev mailing list