diff --git a/extensions/netty/runtime/src/main/java/io/quarkus/netty/runtime/EmptyByteBufStub.java b/extensions/netty/runtime/src/main/java/io/quarkus/netty/runtime/EmptyByteBufStub.java index b6cbb7d939b73..8a0ec95a3cdca 100644 --- a/extensions/netty/runtime/src/main/java/io/quarkus/netty/runtime/EmptyByteBufStub.java +++ b/extensions/netty/runtime/src/main/java/io/quarkus/netty/runtime/EmptyByteBufStub.java @@ -2,13 +2,32 @@ import java.nio.ByteBuffer; +import io.netty.util.internal.PlatformDependent; + public final class EmptyByteBufStub { private static final ByteBuffer EMPTY_BYTE_BUFFER = ByteBuffer.allocateDirect(0); + private static final long EMPTY_BYTE_BUFFER_ADDRESS; + + static { + long emptyByteBufferAddress = 0; + try { + if (PlatformDependent.hasUnsafe()) { + emptyByteBufferAddress = PlatformDependent.directBufferAddress(EMPTY_BYTE_BUFFER); + } + } catch (Throwable t) { + // Ignore + } + EMPTY_BYTE_BUFFER_ADDRESS = emptyByteBufferAddress; + } public static ByteBuffer emptyByteBuffer() { return EMPTY_BYTE_BUFFER; } + public static long emptyByteBufferAddress() { + return EMPTY_BYTE_BUFFER_ADDRESS; + } + private EmptyByteBufStub() { } } diff --git a/extensions/netty/runtime/src/main/java/io/quarkus/netty/runtime/graal/NettySubstitutions.java b/extensions/netty/runtime/src/main/java/io/quarkus/netty/runtime/graal/NettySubstitutions.java index e53f0d3c18785..bb629e7d0c268 100644 --- a/extensions/netty/runtime/src/main/java/io/quarkus/netty/runtime/graal/NettySubstitutions.java +++ b/extensions/netty/runtime/src/main/java/io/quarkus/netty/runtime/graal/NettySubstitutions.java @@ -399,8 +399,8 @@ final class Target_io_netty_buffer_EmptyByteBuf { private static ByteBuffer EMPTY_BYTE_BUFFER; @Alias - @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.FromAlias) - private static long EMPTY_BYTE_BUFFER_ADDRESS = 0; + @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.Reset) + private static long EMPTY_BYTE_BUFFER_ADDRESS; @Substitute public ByteBuffer nioBuffer() { @@ -417,6 +417,20 @@ public ByteBuffer internalNioBuffer(int index, int length) { return EmptyByteBufStub.emptyByteBuffer(); } + @Substitute + public boolean hasMemoryAddress() { + return EmptyByteBufStub.emptyByteBufferAddress() != 0; + } + + @Substitute + public long memoryAddress() { + if (hasMemoryAddress()) { + return EmptyByteBufStub.emptyByteBufferAddress(); + } else { + throw new UnsupportedOperationException(); + } + } + } class NettySubstitutions {