From 6fdf1138ca092073c0a5c57fc2f5e8c2589addd9 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Mon, 16 Jun 2014 11:08:47 +0200 Subject: [PATCH] [#2573] UnpooledUnsafeDirectByteBuf.setBytes(int,ByteBuf,int,int) fails to use fast-path when src has array Motivation: UnpooledUnsafeDirectByteBuf.setBytes(int,ByteBuf,int,int) fails to use fast-path when src uses an array as backing storage. This is because the if else uses the wrong ByteBuf for its check. Modifications: - Use correct ByteBuf when check for array as backing storage - Also eliminate unecessary check in UnpooledDirectByteBuf which always fails anyway Result: Faster setBytes(...) when src ByteBuf is backed by an array. No more IndexOutOfBoundsException or data-corruption. --- .../src/main/java/io/netty/buffer/UnpooledDirectByteBuf.java | 4 +--- .../java/io/netty/buffer/UnpooledUnsafeDirectByteBuf.java | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/buffer/src/main/java/io/netty/buffer/UnpooledDirectByteBuf.java b/buffer/src/main/java/io/netty/buffer/UnpooledDirectByteBuf.java index 844479e4dd..0188491cf0 100644 --- a/buffer/src/main/java/io/netty/buffer/UnpooledDirectByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/UnpooledDirectByteBuf.java @@ -411,9 +411,7 @@ public class UnpooledDirectByteBuf extends AbstractReferenceCountedByteBuf { @Override public ByteBuf setBytes(int index, ByteBuf src, int srcIndex, int length) { checkSrcIndex(index, length, srcIndex, src.capacity()); - if (buffer.hasArray()) { - src.getBytes(srcIndex, buffer.array(), index + buffer.arrayOffset(), length); - } else if (src.nioBufferCount() > 0) { + if (src.nioBufferCount() > 0) { for (ByteBuffer bb: src.nioBuffers(srcIndex, length)) { int bbLen = bb.remaining(); setBytes(index, bb); diff --git a/buffer/src/main/java/io/netty/buffer/UnpooledUnsafeDirectByteBuf.java b/buffer/src/main/java/io/netty/buffer/UnpooledUnsafeDirectByteBuf.java index 9b6cb76f78..bb4c6e6add 100644 --- a/buffer/src/main/java/io/netty/buffer/UnpooledUnsafeDirectByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/UnpooledUnsafeDirectByteBuf.java @@ -355,7 +355,7 @@ public class UnpooledUnsafeDirectByteBuf extends AbstractReferenceCountedByteBuf if (length != 0) { if (src.hasMemoryAddress()) { PlatformDependent.copyMemory(src.memoryAddress() + srcIndex, addr(index), length); - } else if (buffer.hasArray()) { + } else if (src.hasArray()) { PlatformDependent.copyMemory(src.array(), src.arrayOffset() + srcIndex, addr(index), length); } else { src.getBytes(srcIndex, this, index, length);