Reduce even more garbage by exposing ByteBuf.internalNioBuffer()
This commit is contained in:
parent
5131c024fa
commit
283feda119
@ -950,6 +950,11 @@ public abstract class AbstractByteBuf implements ByteBuf {
|
||||
return nioBuffers(readerIndex, readableBytes());
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer nioBuffer(int index, int length) {
|
||||
return internalNioBuffer(index, length).slice();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(Charset charset) {
|
||||
return toString(readerIndex, readableBytes(), charset);
|
||||
|
@ -1784,6 +1784,11 @@ public interface ByteBuf extends ReferenceCounted, Comparable<ByteBuf> {
|
||||
*/
|
||||
ByteBuffer nioBuffer(int index, int length);
|
||||
|
||||
/**
|
||||
* Internal use only: Exposes the internal NIO buffer.
|
||||
*/
|
||||
ByteBuffer internalNioBuffer(int index, int length);
|
||||
|
||||
/**
|
||||
* Exposes this buffer's readable bytes as an NIO {@link ByteBuffer}'s. The returned buffer
|
||||
* shares the content with this buffer, while changing the position and limit of the returned
|
||||
|
@ -991,9 +991,9 @@ public class DefaultCompositeByteBuf extends AbstractReferenceCountedByteBuf imp
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer nioBuffer(int index, int length) {
|
||||
public ByteBuffer internalNioBuffer(int index, int length) {
|
||||
if (components.size() == 1) {
|
||||
return components.get(0).buf.nioBuffer(index, length);
|
||||
return components.get(0).buf.internalNioBuffer(index, length);
|
||||
}
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
@ -282,14 +282,14 @@ public class DuplicatedByteBuf extends AbstractDerivedByteBuf {
|
||||
return buffer.nioBufferCount();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer nioBuffer(int index, int length) {
|
||||
return buffer.nioBuffer(index, length);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer[] nioBuffers(int index, int length) {
|
||||
return buffer.nioBuffers(index, length);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer internalNioBuffer(int index, int length) {
|
||||
return buffer.internalNioBuffer(index, length);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -760,6 +760,11 @@ public final class EmptyByteBuf implements ByteBuf {
|
||||
return nioBuffers();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer internalNioBuffer(int index, int length) {
|
||||
return EMPTY_BYTE_BUFFER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasArray() {
|
||||
return true;
|
||||
|
@ -257,15 +257,15 @@ final class PooledDirectByteBuf extends PooledByteBuf<ByteBuffer> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer nioBuffer(int index, int length) {
|
||||
checkIndex(index, length);
|
||||
index = idx(index);
|
||||
return ((ByteBuffer) internalNioBuffer().clear().position(index).limit(index + length)).slice();
|
||||
public ByteBuffer[] nioBuffers(int index, int length) {
|
||||
return new ByteBuffer[] { nioBuffer(index, length) };
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer[] nioBuffers(int index, int length) {
|
||||
return new ByteBuffer[] { nioBuffer(index, length) };
|
||||
public ByteBuffer internalNioBuffer(int index, int length) {
|
||||
checkIndex(index, length);
|
||||
index = idx(index);
|
||||
return (ByteBuffer) internalNioBuffer().clear().position(index).limit(index + length);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -232,15 +232,15 @@ final class PooledHeapByteBuf extends PooledByteBuf<byte[]> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer nioBuffer(int index, int length) {
|
||||
checkIndex(index, length);
|
||||
index = idx(index);
|
||||
return ((ByteBuffer) internalNioBuffer().clear().position(index).limit(index + length)).slice();
|
||||
public ByteBuffer[] nioBuffers(int index, int length) {
|
||||
return new ByteBuffer[] { nioBuffer(index, length) };
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer[] nioBuffers(int index, int length) {
|
||||
return new ByteBuffer[] { nioBuffer(index, length) };
|
||||
public ByteBuffer internalNioBuffer(int index, int length) {
|
||||
checkIndex(index, length);
|
||||
index = idx(index);
|
||||
return (ByteBuffer) internalNioBuffer().clear().position(index).limit(index + length);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -294,15 +294,15 @@ final class PooledUnsafeDirectByteBuf extends PooledByteBuf<ByteBuffer> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer nioBuffer(int index, int length) {
|
||||
checkIndex(index, length);
|
||||
index = idx(index);
|
||||
return ((ByteBuffer) internalNioBuffer().clear().position(index).limit(index + length)).slice();
|
||||
public ByteBuffer[] nioBuffers(int index, int length) {
|
||||
return new ByteBuffer[] { nioBuffer(index, length) };
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer[] nioBuffers(int index, int length) {
|
||||
return new ByteBuffer[] { nioBuffer(index, length) };
|
||||
public ByteBuffer internalNioBuffer(int index, int length) {
|
||||
checkIndex(index, length);
|
||||
index = idx(index);
|
||||
return (ByteBuffer) internalNioBuffer().clear().position(index).limit(index + length);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -290,6 +290,11 @@ public class ReadOnlyByteBuf extends AbstractDerivedByteBuf {
|
||||
return buffer.nioBuffers(index, length);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer internalNioBuffer(int index, int length) {
|
||||
return buffer.internalNioBuffer(index, length);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int capacity() {
|
||||
return buffer.capacity();
|
||||
|
@ -278,18 +278,14 @@ class ReadOnlyByteBufferBuf extends AbstractReferenceCountedByteBuf {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer nioBuffer(int index, int length) {
|
||||
ensureAccessible();
|
||||
if (index == 0 && length == capacity()) {
|
||||
return buffer.duplicate();
|
||||
} else {
|
||||
return ((ByteBuffer) internalNioBuffer().clear().position(index).limit(index + length)).slice();
|
||||
}
|
||||
public ByteBuffer[] nioBuffers(int index, int length) {
|
||||
return new ByteBuffer[] { nioBuffer(index, length) };
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer[] nioBuffers(int index, int length) {
|
||||
return new ByteBuffer[] { nioBuffer(index, length) };
|
||||
public ByteBuffer internalNioBuffer(int index, int length) {
|
||||
ensureAccessible();
|
||||
return (ByteBuffer) internalNioBuffer().clear().position(index).limit(index + length);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -267,4 +267,10 @@ public class SlicedByteBuf extends AbstractDerivedByteBuf {
|
||||
checkIndex(index, length);
|
||||
return buffer.nioBuffers(index + adjustment, length);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer internalNioBuffer(int index, int length) {
|
||||
checkIndex(index, length);
|
||||
return buffer.internalNioBuffer(index + adjustment, length);
|
||||
}
|
||||
}
|
||||
|
@ -755,6 +755,12 @@ public final class SwappedByteBuf implements ByteBuf {
|
||||
return buf.nioBuffer(index, length).order(order);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer internalNioBuffer(int index, int length) {
|
||||
// Do not mess with the internal buffer's byte order.
|
||||
return buf.nioBuffer(index, length).order(order);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer[] nioBuffers() {
|
||||
ByteBuffer[] nioBuffers = buf.nioBuffers();
|
||||
|
@ -470,16 +470,6 @@ public class UnpooledDirectByteBuf extends AbstractReferenceCountedByteBuf {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer nioBuffer(int index, int length) {
|
||||
ensureAccessible();
|
||||
if (index == 0 && length == capacity()) {
|
||||
return buffer.duplicate();
|
||||
} else {
|
||||
return ((ByteBuffer) internalNioBuffer().clear().position(index).limit(index + length)).slice();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer[] nioBuffers(int index, int length) {
|
||||
return new ByteBuffer[] { nioBuffer(index, length) };
|
||||
@ -503,6 +493,11 @@ public class UnpooledDirectByteBuf extends AbstractReferenceCountedByteBuf {
|
||||
return new UnpooledDirectByteBuf(alloc(), dst, maxCapacity());
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer internalNioBuffer(int index, int length) {
|
||||
return (ByteBuffer) internalNioBuffer().clear().position(index).limit(index + length);
|
||||
}
|
||||
|
||||
private ByteBuffer internalNioBuffer() {
|
||||
ByteBuffer tmpNioBuf = this.tmpNioBuf;
|
||||
if (tmpNioBuf == null) {
|
||||
|
@ -256,6 +256,11 @@ public class UnpooledHeapByteBuf extends AbstractReferenceCountedByteBuf {
|
||||
return new ByteBuffer[] { nioBuffer(index, length) };
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer internalNioBuffer(int index, int length) {
|
||||
return (ByteBuffer) internalNioBuffer().clear().position(index).limit(index + length);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte getByte(int index) {
|
||||
ensureAccessible();
|
||||
|
@ -409,16 +409,6 @@ public class UnpooledUnsafeDirectByteBuf extends AbstractReferenceCountedByteBuf
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer nioBuffer(int index, int length) {
|
||||
ensureAccessible();
|
||||
if (index == 0 && length == capacity()) {
|
||||
return buffer.duplicate();
|
||||
} else {
|
||||
return ((ByteBuffer) internalNioBuffer().clear().position(index).limit(index + length)).slice();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer[] nioBuffers(int index, int length) {
|
||||
return new ByteBuffer[] { nioBuffer(index, length) };
|
||||
@ -435,6 +425,11 @@ public class UnpooledUnsafeDirectByteBuf extends AbstractReferenceCountedByteBuf
|
||||
return copy;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer internalNioBuffer(int index, int length) {
|
||||
return (ByteBuffer) internalNioBuffer().clear().position(index).limit(index + length);
|
||||
}
|
||||
|
||||
private ByteBuffer internalNioBuffer() {
|
||||
ByteBuffer tmpNioBuf = this.tmpNioBuf;
|
||||
if (tmpNioBuf == null) {
|
||||
|
@ -771,6 +771,11 @@ final class UnreleasableByteBuf implements ByteBuf {
|
||||
return buf.nioBuffers(index, length);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer internalNioBuffer(int index, int length) {
|
||||
return buf.internalNioBuffer(index, length);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasArray() {
|
||||
return buf.hasArray();
|
||||
|
@ -729,6 +729,12 @@ final class ReplayingDecoderBuffer implements ByteBuf {
|
||||
return buffer.nioBuffers(index, length);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer internalNioBuffer(int index, int length) {
|
||||
checkIndex(index, length);
|
||||
return buffer.internalNioBuffer(index, length);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(int index, int length, Charset charset) {
|
||||
checkIndex(index, length);
|
||||
|
@ -280,6 +280,7 @@ public class NioSocketChannel extends AbstractNioByteChannel implements io.netty
|
||||
long expectedWrittenBytes = 0;
|
||||
for (int i = index; i < size; i++) {
|
||||
ByteBuf buf = bufs.get(i);
|
||||
int readerIndex = buf.readerIndex();
|
||||
int readableBytes = buf.readableBytes();
|
||||
expectedWrittenBytes += readableBytes;
|
||||
|
||||
@ -289,7 +290,7 @@ public class NioSocketChannel extends AbstractNioByteChannel implements io.netty
|
||||
if (nioBufferCnt == nioBuffers.length) {
|
||||
nioBuffers = doubleNioBufferArray(nioBuffers, nioBufferCnt);
|
||||
}
|
||||
nioBuffers[nioBufferCnt ++] = buf.nioBuffer();
|
||||
nioBuffers[nioBufferCnt ++] = buf.internalNioBuffer(readerIndex, readableBytes);
|
||||
} else {
|
||||
ByteBuffer[] nioBufs = buf.nioBuffers();
|
||||
if (nioBufferCnt + nioBufs.length == nioBuffers.length + 1) {
|
||||
@ -304,13 +305,13 @@ public class NioSocketChannel extends AbstractNioByteChannel implements io.netty
|
||||
}
|
||||
} else {
|
||||
ByteBuf directBuf = alloc().directBuffer(readableBytes);
|
||||
directBuf.writeBytes(buf, buf.readerIndex(), readableBytes);
|
||||
directBuf.writeBytes(buf, readerIndex, readableBytes);
|
||||
buf.release();
|
||||
bufs.set(i, directBuf);
|
||||
if (nioBufferCnt == nioBuffers.length) {
|
||||
nioBuffers = doubleNioBufferArray(nioBuffers, nioBufferCnt);
|
||||
}
|
||||
nioBuffers[nioBufferCnt ++] = directBuf.nioBuffer();
|
||||
nioBuffers[nioBufferCnt ++] = directBuf.internalNioBuffer(0, readableBytes);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user