diff --git a/buffer/src/main/java/io/netty/buffer/AbstractByteBuf.java b/buffer/src/main/java/io/netty/buffer/AbstractByteBuf.java index 41ff7988ce..09d73c4419 100644 --- a/buffer/src/main/java/io/netty/buffer/AbstractByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/AbstractByteBuf.java @@ -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); diff --git a/buffer/src/main/java/io/netty/buffer/ByteBuf.java b/buffer/src/main/java/io/netty/buffer/ByteBuf.java index b201d26328..b8e01c9330 100644 --- a/buffer/src/main/java/io/netty/buffer/ByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/ByteBuf.java @@ -1784,6 +1784,11 @@ public interface ByteBuf extends ReferenceCounted, Comparable { */ 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 diff --git a/buffer/src/main/java/io/netty/buffer/DefaultCompositeByteBuf.java b/buffer/src/main/java/io/netty/buffer/DefaultCompositeByteBuf.java index a67ac7d3e3..960d5c5b87 100644 --- a/buffer/src/main/java/io/netty/buffer/DefaultCompositeByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/DefaultCompositeByteBuf.java @@ -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(); } diff --git a/buffer/src/main/java/io/netty/buffer/DuplicatedByteBuf.java b/buffer/src/main/java/io/netty/buffer/DuplicatedByteBuf.java index 93004943ce..5727c58376 100644 --- a/buffer/src/main/java/io/netty/buffer/DuplicatedByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/DuplicatedByteBuf.java @@ -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); + } } diff --git a/buffer/src/main/java/io/netty/buffer/EmptyByteBuf.java b/buffer/src/main/java/io/netty/buffer/EmptyByteBuf.java index dcf152508d..e8924ab0c7 100644 --- a/buffer/src/main/java/io/netty/buffer/EmptyByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/EmptyByteBuf.java @@ -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; diff --git a/buffer/src/main/java/io/netty/buffer/PooledDirectByteBuf.java b/buffer/src/main/java/io/netty/buffer/PooledDirectByteBuf.java index ab1fca3348..a1a02430c6 100644 --- a/buffer/src/main/java/io/netty/buffer/PooledDirectByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/PooledDirectByteBuf.java @@ -257,15 +257,15 @@ final class PooledDirectByteBuf extends PooledByteBuf { } @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 diff --git a/buffer/src/main/java/io/netty/buffer/PooledHeapByteBuf.java b/buffer/src/main/java/io/netty/buffer/PooledHeapByteBuf.java index 70db1c6252..dceca57d4a 100644 --- a/buffer/src/main/java/io/netty/buffer/PooledHeapByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/PooledHeapByteBuf.java @@ -232,15 +232,15 @@ final class PooledHeapByteBuf extends PooledByteBuf { } @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 diff --git a/buffer/src/main/java/io/netty/buffer/PooledUnsafeDirectByteBuf.java b/buffer/src/main/java/io/netty/buffer/PooledUnsafeDirectByteBuf.java index b23ad068f0..84a83fffdc 100644 --- a/buffer/src/main/java/io/netty/buffer/PooledUnsafeDirectByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/PooledUnsafeDirectByteBuf.java @@ -294,15 +294,15 @@ final class PooledUnsafeDirectByteBuf extends PooledByteBuf { } @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 diff --git a/buffer/src/main/java/io/netty/buffer/ReadOnlyByteBuf.java b/buffer/src/main/java/io/netty/buffer/ReadOnlyByteBuf.java index 3d1426503a..2041a5484d 100644 --- a/buffer/src/main/java/io/netty/buffer/ReadOnlyByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/ReadOnlyByteBuf.java @@ -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(); diff --git a/buffer/src/main/java/io/netty/buffer/ReadOnlyByteBufferBuf.java b/buffer/src/main/java/io/netty/buffer/ReadOnlyByteBufferBuf.java index 83b72bea46..4d1de49f7b 100644 --- a/buffer/src/main/java/io/netty/buffer/ReadOnlyByteBufferBuf.java +++ b/buffer/src/main/java/io/netty/buffer/ReadOnlyByteBufferBuf.java @@ -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 diff --git a/buffer/src/main/java/io/netty/buffer/SlicedByteBuf.java b/buffer/src/main/java/io/netty/buffer/SlicedByteBuf.java index 10a271eb7a..81a0fecb7a 100644 --- a/buffer/src/main/java/io/netty/buffer/SlicedByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/SlicedByteBuf.java @@ -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); + } } diff --git a/buffer/src/main/java/io/netty/buffer/SwappedByteBuf.java b/buffer/src/main/java/io/netty/buffer/SwappedByteBuf.java index 566e0b38b0..a6624f9949 100644 --- a/buffer/src/main/java/io/netty/buffer/SwappedByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/SwappedByteBuf.java @@ -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(); diff --git a/buffer/src/main/java/io/netty/buffer/UnpooledDirectByteBuf.java b/buffer/src/main/java/io/netty/buffer/UnpooledDirectByteBuf.java index b9d49ac15a..d6ad1994e0 100644 --- a/buffer/src/main/java/io/netty/buffer/UnpooledDirectByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/UnpooledDirectByteBuf.java @@ -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) { diff --git a/buffer/src/main/java/io/netty/buffer/UnpooledHeapByteBuf.java b/buffer/src/main/java/io/netty/buffer/UnpooledHeapByteBuf.java index ce70ff2f14..2f3b5a6d11 100644 --- a/buffer/src/main/java/io/netty/buffer/UnpooledHeapByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/UnpooledHeapByteBuf.java @@ -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(); diff --git a/buffer/src/main/java/io/netty/buffer/UnpooledUnsafeDirectByteBuf.java b/buffer/src/main/java/io/netty/buffer/UnpooledUnsafeDirectByteBuf.java index 3dbf665c09..237b4e3b66 100644 --- a/buffer/src/main/java/io/netty/buffer/UnpooledUnsafeDirectByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/UnpooledUnsafeDirectByteBuf.java @@ -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) { diff --git a/buffer/src/main/java/io/netty/buffer/UnreleasableByteBuf.java b/buffer/src/main/java/io/netty/buffer/UnreleasableByteBuf.java index c56fc49b53..3dd629525e 100644 --- a/buffer/src/main/java/io/netty/buffer/UnreleasableByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/UnreleasableByteBuf.java @@ -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(); diff --git a/codec/src/main/java/io/netty/handler/codec/ReplayingDecoderBuffer.java b/codec/src/main/java/io/netty/handler/codec/ReplayingDecoderBuffer.java index 60d17fbfdb..9f362e3bba 100644 --- a/codec/src/main/java/io/netty/handler/codec/ReplayingDecoderBuffer.java +++ b/codec/src/main/java/io/netty/handler/codec/ReplayingDecoderBuffer.java @@ -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); diff --git a/transport/src/main/java/io/netty/channel/socket/nio/NioSocketChannel.java b/transport/src/main/java/io/netty/channel/socket/nio/NioSocketChannel.java index 6c2d27f496..76da0a373e 100755 --- a/transport/src/main/java/io/netty/channel/socket/nio/NioSocketChannel.java +++ b/transport/src/main/java/io/netty/channel/socket/nio/NioSocketChannel.java @@ -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); } }