diff --git a/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/MemSegBuffer.java b/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/MemSegBuffer.java index efaf177..1d2f245 100644 --- a/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/MemSegBuffer.java +++ b/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/MemSegBuffer.java @@ -31,26 +31,12 @@ import io.netty.buffer.api.internal.ArcDrop; import io.netty.buffer.api.internal.Statics; import jdk.incubator.foreign.MemorySegment; import jdk.incubator.foreign.ResourceScope; +import jdk.incubator.foreign.ValueLayout; import java.nio.ByteBuffer; -import java.nio.ByteOrder; import static io.netty.buffer.api.internal.Statics.bufferIsClosed; import static io.netty.buffer.api.internal.Statics.bufferIsReadOnly; -import static jdk.incubator.foreign.MemoryAccess.getByteAtOffset; -import static jdk.incubator.foreign.MemoryAccess.getCharAtOffset; -import static jdk.incubator.foreign.MemoryAccess.getDoubleAtOffset; -import static jdk.incubator.foreign.MemoryAccess.getFloatAtOffset; -import static jdk.incubator.foreign.MemoryAccess.getIntAtOffset; -import static jdk.incubator.foreign.MemoryAccess.getLongAtOffset; -import static jdk.incubator.foreign.MemoryAccess.getShortAtOffset; -import static jdk.incubator.foreign.MemoryAccess.setByteAtOffset; -import static jdk.incubator.foreign.MemoryAccess.setCharAtOffset; -import static jdk.incubator.foreign.MemoryAccess.setDoubleAtOffset; -import static jdk.incubator.foreign.MemoryAccess.setFloatAtOffset; -import static jdk.incubator.foreign.MemoryAccess.setIntAtOffset; -import static jdk.incubator.foreign.MemoryAccess.setLongAtOffset; -import static jdk.incubator.foreign.MemoryAccess.setShortAtOffset; class MemSegBuffer extends AdaptableBuffer implements ReadableComponent, WritableComponent { private static final MemorySegment CLOSED_SEGMENT; @@ -66,17 +52,26 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp MemorySegment segment = MemorySegment.allocateNative(1, scope); CLOSED_SEGMENT = segment.asSlice(0, 0); } - ZERO_OFFHEAP_SEGMENT = MemorySegment.allocateNative(1, ResourceScope.newImplicitScope()).asSlice(0, 0); + ZERO_OFFHEAP_SEGMENT = MemorySegment.allocateNative(1, ResourceScope.globalScope()).asSlice(0, 0); ZERO_ONHEAP_SEGMENT = MemorySegment.ofArray(new byte[0]); SEGMENT_CLOSE = new Drop() { @Override public void drop(MemSegBuffer buf) { ResourceScope scope = buf.base.scope(); - if (!scope.isImplicit()) { + if (scope != ResourceScope.globalScope()) { scope.close(); } } + @Override + public Drop fork() { + return this; + } + + @Override + public void attach(MemSegBuffer obj) { + } + @Override public String toString() { return "SEGMENT_CLOSE"; @@ -88,30 +83,27 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp private MemorySegment base; private MemorySegment seg; private MemorySegment wseg; - private ByteOrder order; private int roff; private int woff; private boolean constBuffer; MemSegBuffer(MemorySegment base, MemorySegment view, Drop drop, AllocatorControl control) { - super(ArcDrop.wrap(drop)); + super(drop, control); this.control = control; this.base = base; seg = view; wseg = view; - order = ByteOrder.BIG_ENDIAN; } /** * Constructor for {@linkplain BufferAllocator#constBufferSupplier(byte[]) const buffers}. */ MemSegBuffer(MemSegBuffer parent) { - super(new ArcDrop<>(ArcDrop.acquire(parent.unsafeGetDrop()))); + super(parent.unsafeGetDrop(), parent.control); control = parent.control; base = parent.base; seg = parent.seg; wseg = parent.wseg; - order = parent.order; roff = parent.roff; woff = parent.woff; constBuffer = true; @@ -197,7 +189,7 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp var buffer = seg.asByteBuffer(); buffer = buffer.asReadOnlyBuffer(); buffer = buffer.position(readerOffset()).limit(readerOffset() + readableBytes()); - return buffer.order(order); + return buffer; } @Override @@ -229,7 +221,7 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp public ByteBuffer writableBuffer() { var buffer = wseg.asByteBuffer(); buffer = buffer.position(writerOffset()).limit(writerOffset() + writableBytes()); - return buffer.order(order); + return buffer; } // @@ -269,7 +261,7 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp } else { zero = ZERO_OFFHEAP_SEGMENT; } - return new MemSegBuffer(zero, zero, Statics.noOpDrop(), control); + return new MemSegBuffer(zero, zero, SEGMENT_CLOSE, control); } AllocatorControl.UntetheredMemory memory = control.allocateUntethered(this, length); @@ -350,7 +342,7 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public boolean readByte() { if (index < end) { - byteValue = getByteAtOffset(segment, index); + byteValue = segment.get(ValueLayout.JAVA_BYTE, index); index++; return true; } @@ -407,7 +399,7 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public boolean readByte() { if (index > end) { - byteValue = getByteAtOffset(segment, index); + byteValue = segment.get(ValueLayout.JAVA_BYTE, index); index--; return true; } @@ -578,6 +570,62 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp } // + private static byte getByteAtOffset(MemorySegment seg, int roff) { + return seg.get(ValueLayout.JAVA_BYTE, roff); + } + + private static void setByteAtOffset(MemorySegment seg, int woff, byte value) { + seg.set(ValueLayout.JAVA_BYTE, woff, value); + } + + private static short getShortAtOffset(MemorySegment seg, int roff) { + return seg.get(ValueLayout.JAVA_SHORT, roff); + } + + private static void setShortAtOffset(MemorySegment seg, int woff, short value) { + seg.set(ValueLayout.JAVA_SHORT, woff, value); + } + + private static char getCharAtOffset(MemorySegment seg, int roff) { + return seg.get(ValueLayout.JAVA_CHAR, roff); + } + + private static void setCharAtOffset(MemorySegment seg, int woff, char value) { + seg.set(ValueLayout.JAVA_CHAR, woff, value); + } + + private static int getIntAtOffset(MemorySegment seg, int roff) { + return seg.get(ValueLayout.JAVA_INT, roff); + } + + private static void setIntAtOffset(MemorySegment seg, int woff, int value) { + seg.set(ValueLayout.JAVA_INT, woff, value); + } + + private static float getFloatAtOffset(MemorySegment seg, int roff) { + return seg.get(ValueLayout.JAVA_FLOAT, roff); + } + + private static void setFloatAtOffset(MemorySegment seg, int woff, float value) { + seg.set(ValueLayout.JAVA_FLOAT, woff, value); + } + + private static long getLongAtOffset(MemorySegment seg, int roff) { + return seg.get(ValueLayout.JAVA_LONG, roff); + } + + private static void setLongAtOffset(MemorySegment seg, int woff, long value) { + seg.set(ValueLayout.JAVA_LONG, woff, value); + } + + private static double getDoubleAtOffset(MemorySegment seg, int roff) { + return seg.get(ValueLayout.JAVA_DOUBLE, roff); + } + + private static void setDoubleAtOffset(MemorySegment seg, int woff, double value) { + seg.set(ValueLayout.JAVA_DOUBLE, woff, value); + } + @Override public byte readByte() { checkRead(roff, Byte.BYTES); @@ -651,7 +699,7 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public char readChar() { checkRead(roff, 2); - char value = getCharAtOffset(seg, roff, order); + char value = getCharAtOffset(seg, roff); roff += 2; return value; } @@ -659,13 +707,13 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public char getChar(int roff) { checkGet(roff, 2); - return getCharAtOffset(seg, roff, order); + return getCharAtOffset(seg, roff); } @Override public Buffer writeChar(char value) { try { - setCharAtOffset(wseg, woff, order, value); + setCharAtOffset(wseg, woff, value); woff += 2; return this; } catch (IndexOutOfBoundsException e) { @@ -676,7 +724,7 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public Buffer setChar(int woff, char value) { try { - setCharAtOffset(wseg, woff, order, value); + setCharAtOffset(wseg, woff, value); return this; } catch (IndexOutOfBoundsException e) { throw checkWriteState(e); @@ -686,7 +734,7 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public short readShort() { checkRead(roff, Short.BYTES); - short value = getShortAtOffset(seg, roff, order); + short value = getShortAtOffset(seg, roff); roff += Short.BYTES; return value; } @@ -694,13 +742,13 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public short getShort(int roff) { checkGet(roff, Short.BYTES); - return getShortAtOffset(seg, roff, order); + return getShortAtOffset(seg, roff); } @Override public int readUnsignedShort() { checkRead(roff, Short.BYTES); - int value = getShortAtOffset(seg, roff, order) & 0xFFFF; + int value = getShortAtOffset(seg, roff) & 0xFFFF; roff += Short.BYTES; return value; } @@ -708,13 +756,13 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public int getUnsignedShort(int roff) { checkGet(roff, Short.BYTES); - return getShortAtOffset(seg, roff, order) & 0xFFFF; + return getShortAtOffset(seg, roff) & 0xFFFF; } @Override public Buffer writeShort(short value) { try { - setShortAtOffset(wseg, woff, order, value); + setShortAtOffset(wseg, woff, value); woff += Short.BYTES; return this; } catch (IndexOutOfBoundsException e) { @@ -725,7 +773,7 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public Buffer setShort(int woff, short value) { try { - setShortAtOffset(wseg, woff, order, value); + setShortAtOffset(wseg, woff, value); return this; } catch (IndexOutOfBoundsException e) { throw checkWriteState(e); @@ -735,7 +783,7 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public Buffer writeUnsignedShort(int value) { try { - setShortAtOffset(wseg, woff, order, (short) (value & 0xFFFF)); + setShortAtOffset(wseg, woff, (short) (value & 0xFFFF)); woff += Short.BYTES; return this; } catch (IndexOutOfBoundsException e) { @@ -746,7 +794,7 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public Buffer setUnsignedShort(int woff, int value) { try { - setShortAtOffset(wseg, woff, order, (short) (value & 0xFFFF)); + setShortAtOffset(wseg, woff, (short) (value & 0xFFFF)); return this; } catch (IndexOutOfBoundsException e) { throw checkWriteState(e); @@ -756,13 +804,9 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public int readMedium() { checkRead(roff, 3); - int value = order == ByteOrder.BIG_ENDIAN? - getByteAtOffset(seg, roff) << 16 | + int value = getByteAtOffset(seg, roff) << 16 | (getByteAtOffset(seg, roff + 1) & 0xFF) << 8 | - getByteAtOffset(seg, roff + 2) & 0xFF : - getByteAtOffset(seg, roff) & 0xFF | - (getByteAtOffset(seg, roff + 1) & 0xFF) << 8 | - getByteAtOffset(seg, roff + 2) << 16; + getByteAtOffset(seg, roff + 2) & 0xFF; roff += 3; return value; } @@ -770,25 +814,17 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public int getMedium(int roff) { checkGet(roff, 3); - return order == ByteOrder.BIG_ENDIAN? - getByteAtOffset(seg, roff) << 16 | + return getByteAtOffset(seg, roff) << 16 | (getByteAtOffset(seg, roff + 1) & 0xFF) << 8 | - getByteAtOffset(seg, roff + 2) & 0xFF : - getByteAtOffset(seg, roff) & 0xFF | - (getByteAtOffset(seg, roff + 1) & 0xFF) << 8 | - getByteAtOffset(seg, roff + 2) << 16; + getByteAtOffset(seg, roff + 2) & 0xFF; } @Override public int readUnsignedMedium() { checkRead(roff, 3); - int value = order == ByteOrder.BIG_ENDIAN? - (getByteAtOffset(seg, roff) << 16 | + int value = (getByteAtOffset(seg, roff) << 16 | (getByteAtOffset(seg, roff + 1) & 0xFF) << 8 | - getByteAtOffset(seg, roff + 2) & 0xFF) & 0xFFFFFF : - (getByteAtOffset(seg, roff) & 0xFF | - (getByteAtOffset(seg, roff + 1) & 0xFF) << 8 | - getByteAtOffset(seg, roff + 2) << 16) & 0xFFFFFF; + getByteAtOffset(seg, roff + 2) & 0xFF) & 0xFFFFFF; roff += 3; return value; } @@ -796,27 +832,17 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public int getUnsignedMedium(int roff) { checkGet(roff, 3); - return order == ByteOrder.BIG_ENDIAN? - (getByteAtOffset(seg, roff) << 16 | + return (getByteAtOffset(seg, roff) << 16 | (getByteAtOffset(seg, roff + 1) & 0xFF) << 8 | - getByteAtOffset(seg, roff + 2) & 0xFF) & 0xFFFFFF : - (getByteAtOffset(seg, roff) & 0xFF | - (getByteAtOffset(seg, roff + 1) & 0xFF) << 8 | - getByteAtOffset(seg, roff + 2) << 16) & 0xFFFFFF; + getByteAtOffset(seg, roff + 2) & 0xFF) & 0xFFFFFF; } @Override public Buffer writeMedium(int value) { checkWrite(woff, 3); - if (order == ByteOrder.BIG_ENDIAN) { - setByteAtOffset(wseg, woff, (byte) (value >> 16)); - setByteAtOffset(wseg, woff + 1, (byte) (value >> 8 & 0xFF)); - setByteAtOffset(wseg, woff + 2, (byte) (value & 0xFF)); - } else { - setByteAtOffset(wseg, woff, (byte) (value & 0xFF)); - setByteAtOffset(wseg, woff + 1, (byte) (value >> 8 & 0xFF)); - setByteAtOffset(wseg, woff + 2, (byte) (value >> 16 & 0xFF)); - } + setByteAtOffset(wseg, woff, (byte) (value >> 16)); + setByteAtOffset(wseg, woff + 1, (byte) (value >> 8 & 0xFF)); + setByteAtOffset(wseg, woff + 2, (byte) (value & 0xFF)); woff += 3; return this; } @@ -824,30 +850,18 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public Buffer setMedium(int woff, int value) { checkSet(woff, 3); - if (order == ByteOrder.BIG_ENDIAN) { - setByteAtOffset(wseg, woff, (byte) (value >> 16)); - setByteAtOffset(wseg, woff + 1, (byte) (value >> 8 & 0xFF)); - setByteAtOffset(wseg, woff + 2, (byte) (value & 0xFF)); - } else { - setByteAtOffset(wseg, woff, (byte) (value & 0xFF)); - setByteAtOffset(wseg, woff + 1, (byte) (value >> 8 & 0xFF)); - setByteAtOffset(wseg, woff + 2, (byte) (value >> 16 & 0xFF)); - } + setByteAtOffset(wseg, woff, (byte) (value >> 16)); + setByteAtOffset(wseg, woff + 1, (byte) (value >> 8 & 0xFF)); + setByteAtOffset(wseg, woff + 2, (byte) (value & 0xFF)); return this; } @Override public Buffer writeUnsignedMedium(int value) { checkWrite(woff, 3); - if (order == ByteOrder.BIG_ENDIAN) { - setByteAtOffset(wseg, woff, (byte) (value >> 16)); - setByteAtOffset(wseg, woff + 1, (byte) (value >> 8 & 0xFF)); - setByteAtOffset(wseg, woff + 2, (byte) (value & 0xFF)); - } else { - setByteAtOffset(wseg, woff, (byte) (value & 0xFF)); - setByteAtOffset(wseg, woff + 1, (byte) (value >> 8 & 0xFF)); - setByteAtOffset(wseg, woff + 2, (byte) (value >> 16 & 0xFF)); - } + setByteAtOffset(wseg, woff, (byte) (value >> 16)); + setByteAtOffset(wseg, woff + 1, (byte) (value >> 8 & 0xFF)); + setByteAtOffset(wseg, woff + 2, (byte) (value & 0xFF)); woff += 3; return this; } @@ -855,22 +869,16 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public Buffer setUnsignedMedium(int woff, int value) { checkSet(woff, 3); - if (order == ByteOrder.BIG_ENDIAN) { - setByteAtOffset(wseg, woff, (byte) (value >> 16)); - setByteAtOffset(wseg, woff + 1, (byte) (value >> 8 & 0xFF)); - setByteAtOffset(wseg, woff + 2, (byte) (value & 0xFF)); - } else { - setByteAtOffset(wseg, woff, (byte) (value & 0xFF)); - setByteAtOffset(wseg, woff + 1, (byte) (value >> 8 & 0xFF)); - setByteAtOffset(wseg, woff + 2, (byte) (value >> 16 & 0xFF)); - } + setByteAtOffset(wseg, woff, (byte) (value >> 16)); + setByteAtOffset(wseg, woff + 1, (byte) (value >> 8 & 0xFF)); + setByteAtOffset(wseg, woff + 2, (byte) (value & 0xFF)); return this; } @Override public int readInt() { checkRead(roff, Integer.BYTES); - int value = getIntAtOffset(seg, roff, order); + int value = getIntAtOffset(seg, roff); roff += Integer.BYTES; return value; } @@ -878,13 +886,13 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public int getInt(int roff) { checkGet(roff, Integer.BYTES); - return getIntAtOffset(seg, roff, order); + return getIntAtOffset(seg, roff); } @Override public long readUnsignedInt() { checkRead(roff, Integer.BYTES); - long value = getIntAtOffset(seg, roff, order) & 0xFFFFFFFFL; + long value = getIntAtOffset(seg, roff) & 0xFFFFFFFFL; roff += Integer.BYTES; return value; } @@ -892,13 +900,13 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public long getUnsignedInt(int roff) { checkGet(roff, Integer.BYTES); - return getIntAtOffset(seg, roff, order) & 0xFFFFFFFFL; + return getIntAtOffset(seg, roff) & 0xFFFFFFFFL; } @Override public Buffer writeInt(int value) { try { - setIntAtOffset(wseg, woff, order, value); + setIntAtOffset(wseg, woff, value); woff += Integer.BYTES; return this; } catch (IndexOutOfBoundsException e) { @@ -909,7 +917,7 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public Buffer setInt(int woff, int value) { try { - setIntAtOffset(wseg, woff, order, value); + setIntAtOffset(wseg, woff, value); return this; } catch (IndexOutOfBoundsException e) { throw checkWriteState(e); @@ -919,7 +927,7 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public Buffer writeUnsignedInt(long value) { try { - setIntAtOffset(wseg, woff, order, (int) (value & 0xFFFFFFFFL)); + setIntAtOffset(wseg, woff, (int) (value & 0xFFFFFFFFL)); woff += Integer.BYTES; return this; } catch (IndexOutOfBoundsException e) { @@ -930,7 +938,7 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public Buffer setUnsignedInt(int woff, long value) { try { - setIntAtOffset(wseg, woff, order, (int) (value & 0xFFFFFFFFL)); + setIntAtOffset(wseg, woff, (int) (value & 0xFFFFFFFFL)); return this; } catch (IndexOutOfBoundsException e) { throw checkWriteState(e); @@ -940,7 +948,7 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public float readFloat() { checkRead(roff, Float.BYTES); - float value = getFloatAtOffset(seg, roff, order); + float value = getFloatAtOffset(seg, roff); roff += Float.BYTES; return value; } @@ -948,13 +956,13 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public float getFloat(int roff) { checkGet(roff, Float.BYTES); - return getFloatAtOffset(seg, roff, order); + return getFloatAtOffset(seg, roff); } @Override public Buffer writeFloat(float value) { try { - setFloatAtOffset(wseg, woff, order, value); + setFloatAtOffset(wseg, woff, value); woff += Float.BYTES; return this; } catch (IndexOutOfBoundsException e) { @@ -965,7 +973,7 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public Buffer setFloat(int woff, float value) { try { - setFloatAtOffset(wseg, woff, order, value); + setFloatAtOffset(wseg, woff, value); return this; } catch (IndexOutOfBoundsException e) { throw checkWriteState(e); @@ -975,7 +983,7 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public long readLong() { checkRead(roff, Long.BYTES); - long value = getLongAtOffset(seg, roff, order); + long value = getLongAtOffset(seg, roff); roff += Long.BYTES; return value; } @@ -983,13 +991,13 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public long getLong(int roff) { checkGet(roff, Long.BYTES); - return getLongAtOffset(seg, roff, order); + return getLongAtOffset(seg, roff); } @Override public Buffer writeLong(long value) { try { - setLongAtOffset(wseg, woff, order, value); + setLongAtOffset(wseg, woff, value); woff += Long.BYTES; return this; } catch (IndexOutOfBoundsException e) { @@ -1000,7 +1008,7 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public Buffer setLong(int woff, long value) { try { - setLongAtOffset(wseg, woff, order, value); + setLongAtOffset(wseg, woff, value); return this; } catch (IndexOutOfBoundsException e) { throw checkWriteState(e); @@ -1010,7 +1018,7 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public double readDouble() { checkRead(roff, Double.BYTES); - double value = getDoubleAtOffset(seg, roff, order); + double value = getDoubleAtOffset(seg, roff); roff += Double.BYTES; return value; } @@ -1018,13 +1026,13 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public double getDouble(int roff) { checkGet(roff, Double.BYTES); - return getDoubleAtOffset(seg, roff, order); + return getDoubleAtOffset(seg, roff); } @Override public Buffer writeDouble(double value) { try { - setDoubleAtOffset(wseg, woff, order, value); + setDoubleAtOffset(wseg, woff, value); woff += Double.BYTES; return this; } catch (IndexOutOfBoundsException e) { @@ -1035,7 +1043,7 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public Buffer setDouble(int woff, double value) { try { - setDoubleAtOffset(wseg, woff, order, value); + setDoubleAtOffset(wseg, woff, value); return this; } catch (IndexOutOfBoundsException e) { throw checkWriteState(e); @@ -1045,7 +1053,6 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override protected Owned prepareSend() { - var order = this.order; var roff = this.roff; var woff = this.woff; var readOnly = readOnly(); @@ -1057,7 +1064,6 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp @Override public MemSegBuffer transferOwnership(Drop drop) { MemSegBuffer copy = new MemSegBuffer(base, transferSegment, drop, control); - copy.order = order; copy.roff = roff; copy.woff = woff; if (readOnly) { @@ -1078,16 +1084,6 @@ class MemSegBuffer extends AdaptableBuffer implements ReadableComp woff = 0; } - @Override - public boolean isOwned() { - return super.isOwned() && ((ArcDrop) unsafeGetDrop()).isOwned(); - } - - @Override - public int countBorrows() { - return super.countBorrows() + ((ArcDrop) unsafeGetDrop()).countBorrows(); - } - private void checkRead(int index, int size) { if (index < 0 || woff < index + size) { throw readAccessCheckException(index); diff --git a/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/SegmentMemoryManagers.java b/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/SegmentMemoryManagers.java index 898a16d..1d34ca8 100644 --- a/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/SegmentMemoryManagers.java +++ b/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/SegmentMemoryManagers.java @@ -53,12 +53,12 @@ public class SegmentMemoryManagers implements MemoryManager { } @Override - public Buffer allocateShared(AllocatorControl allocatorControl, long size, Drop drop, Cleaner cleaner, + public Buffer allocateShared(AllocatorControl allocatorControl, long size, Drop drop, AllocationType type) { if (type instanceof StandardAllocationTypes stype) { var segment = switch (stype) { case ON_HEAP -> createHeapSegment(size); - case OFF_HEAP -> createNativeSegment(size, cleaner); + case OFF_HEAP -> createNativeSegment(size, null); }; return new MemSegBuffer(segment, segment, Statics.convert(drop), allocatorControl); } diff --git a/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferLifeCycleTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferLifeCycleTest.java index 3e3e990..3c1654e 100644 --- a/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferLifeCycleTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferLifeCycleTest.java @@ -560,8 +560,8 @@ public class BufferLifeCycleTest extends BufferTestSupport { copy.resetOffsets().ensureWritable(Long.BYTES); assertThat(split.capacity()).isEqualTo(Long.BYTES); assertThat(copy.capacity()).isEqualTo(Long.BYTES); - assertThat(split.getLong(0)).isEqualTo(0x01020304_00000000L); - assertThat(copy.getLong(0)).isEqualTo(0x05060708_00000000L); + assertEquals(0x01020304, split.getInt(0)); + assertEquals(0x05060708, copy.getInt(0)); } } } diff --git a/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferTestSupport.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferTestSupport.java index ca24c90..0acc633 100644 --- a/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferTestSupport.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferTestSupport.java @@ -15,6 +15,7 @@ */ package io.netty.buffer.api.tests; +import io.netty.buffer.api.AllocationType; import io.netty.buffer.api.Buffer; import io.netty.buffer.api.BufferAllocator; import io.netty.buffer.api.BufferClosedException; @@ -184,6 +185,17 @@ public abstract class BufferTestSupport { return new TestAllocator() { final BufferAllocator a = first.get(); final BufferAllocator b = second.get(); + + @Override + public boolean isPooling() { + return a.isPooling(); + } + + @Override + public AllocationType getAllocationType() { + return a.getAllocationType(); + } + @Override public Buffer allocate(int size) { int half = size / 2; @@ -207,6 +219,17 @@ public abstract class BufferTestSupport { builder.add(new Fixture("compose(heap,heap,heap)", () -> { return new TestAllocator() { final BufferAllocator alloc = BufferAllocator.onHeapUnpooled(); + + @Override + public boolean isPooling() { + return alloc.isPooling(); + } + + @Override + public AllocationType getAllocationType() { + return alloc.getAllocationType(); + } + @Override public Buffer allocate(int size) { int part = size / 3; @@ -228,6 +251,17 @@ public abstract class BufferTestSupport { builder.add(new Fixture(fixture + ".ensureWritable", () -> { return new TestAllocator() { final BufferAllocator allocator = fixture.createAllocator(); + + @Override + public boolean isPooling() { + return allocator.isPooling(); + } + + @Override + public AllocationType getAllocationType() { + return allocator.getAllocationType(); + } + @Override public Buffer allocate(int size) { if (size < 2) { @@ -247,6 +281,17 @@ public abstract class BufferTestSupport { builder.add(new Fixture(fixture + ".compose.ensureWritable", () -> { return new TestAllocator() { final BufferAllocator allocator = fixture.createAllocator(); + + @Override + public boolean isPooling() { + return allocator.isPooling(); + } + + @Override + public AllocationType getAllocationType() { + return allocator.getAllocationType(); + } + @Override public Buffer allocate(int size) { if (size < 2) { @@ -275,6 +320,17 @@ public abstract class BufferTestSupport { builder.add(new Fixture(f + ".split", () -> { return new TestAllocator() { final BufferAllocator allocatorBase = f.get(); + + @Override + public boolean isPooling() { + return allocatorBase.isPooling(); + } + + @Override + public AllocationType getAllocationType() { + return allocatorBase.getAllocationType(); + } + @Override public Buffer allocate(int size) { try (Buffer buf = allocatorBase.allocate(size + 1)) { diff --git a/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/bytetomessagedecoder/ByteToMessageDecoderTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/bytetomessagedecoder/ByteToMessageDecoderTest.java index d4a79c3..4f39cd2 100644 --- a/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/bytetomessagedecoder/ByteToMessageDecoderTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/bytetomessagedecoder/ByteToMessageDecoderTest.java @@ -15,6 +15,7 @@ */ package io.netty.buffer.api.tests.examples.bytetomessagedecoder; +import io.netty.buffer.api.AllocationType; import io.netty.buffer.api.Buffer; import io.netty.buffer.api.BufferAllocator; import io.netty.channel.ChannelHandler; @@ -407,6 +408,16 @@ public class ByteToMessageDecoderTest { Buffer newCumulation = writeFailingCumulation(untilFailure, 16); BufferAllocator allocator = new BufferAllocator() { + @Override + public boolean isPooling() { + return false; + } + + @Override + public AllocationType getAllocationType() { + return null; + } + @Override public Buffer allocate(int capacity) { return newCumulation;