Skip to content

Commit 6f79291

Browse files
author
Norman Maurer
committed
[netty#1797] No use internalNioBuffer() in derived buffers as it is not meant for concurrent access
1 parent 60b06df commit 6f79291

15 files changed

Lines changed: 90 additions & 13 deletions

buffer/src/main/java/io/netty/buffer/AbstractByteBuf.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -936,11 +936,6 @@ public ByteBuffer[] nioBuffers() {
936936
return nioBuffers(readerIndex, readableBytes());
937937
}
938938

939-
@Override
940-
public ByteBuffer nioBuffer(int index, int length) {
941-
return internalNioBuffer(index, length).slice();
942-
}
943-
944939
@Override
945940
public String toString(Charset charset) {
946941
return toString(readerIndex, readableBytes(), charset);

buffer/src/main/java/io/netty/buffer/AbstractDerivedByteBuf.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package io.netty.buffer;
1818

19+
import java.nio.ByteBuffer;
20+
1921
/**
2022
* Abstract base class for {@link ByteBuf} implementations that wrap another
2123
* {@link ByteBuf}.
@@ -52,4 +54,14 @@ public final boolean release() {
5254
public final boolean release(int decrement) {
5355
return unwrap().release(decrement);
5456
}
57+
58+
@Override
59+
public ByteBuffer internalNioBuffer(int index, int length) {
60+
return nioBuffer(index, length);
61+
}
62+
63+
@Override
64+
public ByteBuffer nioBuffer(int index, int length) {
65+
return unwrap().nioBuffer(index, length);
66+
}
5567
}

buffer/src/main/java/io/netty/buffer/CompositeByteBuf.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,6 +1108,26 @@ public ByteBuffer internalNioBuffer(int index, int length) {
11081108
throw new UnsupportedOperationException();
11091109
}
11101110

1111+
@Override
1112+
public ByteBuffer nioBuffer(int index, int length) {
1113+
if (components.size() == 1) {
1114+
ByteBuf buf = components.get(0).buf;
1115+
if (buf.nioBufferCount() == 1) {
1116+
return components.get(0).buf.nioBuffer(index, length);
1117+
}
1118+
}
1119+
ByteBuffer merged = ByteBuffer.allocate(length).order(order());
1120+
ByteBuffer[] buffers = nioBuffers(index, length);
1121+
1122+
//noinspection ForLoopReplaceableByForEach
1123+
for (int i = 0; i < buffers.length; i++) {
1124+
merged.put(buffers[0]);
1125+
}
1126+
1127+
merged.flip();
1128+
return merged;
1129+
}
1130+
11111131
@Override
11121132
public ByteBuffer[] nioBuffers(int index, int length) {
11131133
checkIndex(index, length);

buffer/src/main/java/io/netty/buffer/DuplicatedByteBuf.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ public ByteBuffer[] nioBuffers(int index, int length) {
289289

290290
@Override
291291
public ByteBuffer internalNioBuffer(int index, int length) {
292-
return buffer.internalNioBuffer(index, length).duplicate();
292+
return nioBuffer(index, length);
293293
}
294294

295295
@Override

buffer/src/main/java/io/netty/buffer/PooledDirectByteBuf.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,13 @@ public int nioBufferCount() {
257257
return 1;
258258
}
259259

260+
@Override
261+
public ByteBuffer nioBuffer(int index, int length) {
262+
checkIndex(index, length);
263+
index = idx(index);
264+
return (ByteBuffer) memory.duplicate().position(index).limit(index + length);
265+
}
266+
260267
@Override
261268
public ByteBuffer[] nioBuffers(int index, int length) {
262269
return new ByteBuffer[] { nioBuffer(index, length) };

buffer/src/main/java/io/netty/buffer/PooledHeapByteBuf.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,13 @@ public ByteBuffer[] nioBuffers(int index, int length) {
237237
return new ByteBuffer[] { nioBuffer(index, length) };
238238
}
239239

240+
@Override
241+
public ByteBuffer nioBuffer(int index, int length) {
242+
checkIndex(index, length);
243+
index = idx(index);
244+
return (ByteBuffer) ByteBuffer.wrap(memory).position(index).limit(index + length);
245+
}
246+
240247
@Override
241248
public ByteBuffer internalNioBuffer(int index, int length) {
242249
checkIndex(index, length);

buffer/src/main/java/io/netty/buffer/PooledUnsafeDirectByteBuf.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,13 @@ public ByteBuffer[] nioBuffers(int index, int length) {
299299
return new ByteBuffer[] { nioBuffer(index, length) };
300300
}
301301

302+
@Override
303+
public ByteBuffer nioBuffer(int index, int length) {
304+
checkIndex(index, length);
305+
index = idx(index);
306+
return (ByteBuffer) memory.duplicate().position(index).limit(index + length);
307+
}
308+
302309
@Override
303310
public ByteBuffer internalNioBuffer(int index, int length) {
304311
checkIndex(index, length);

buffer/src/main/java/io/netty/buffer/ReadOnlyByteBuf.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ public ByteBuffer[] nioBuffers(int index, int length) {
292292

293293
@Override
294294
public ByteBuffer internalNioBuffer(int index, int length) {
295-
return buffer.internalNioBuffer(index, length).duplicate();
295+
return nioBuffer(index, length);
296296
}
297297

298298
@Override

buffer/src/main/java/io/netty/buffer/ReadOnlyByteBufferBuf.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,11 @@ public ByteBuffer[] nioBuffers(int index, int length) {
303303
return new ByteBuffer[] { nioBuffer(index, length) };
304304
}
305305

306+
@Override
307+
public ByteBuffer nioBuffer(int index, int length) {
308+
return (ByteBuffer) buffer.duplicate().position(index).limit(length);
309+
}
310+
306311
@Override
307312
public ByteBuffer internalNioBuffer(int index, int length) {
308313
ensureAccessible();

buffer/src/main/java/io/netty/buffer/SlicedByteBuf.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ public ByteBuffer[] nioBuffers(int index, int length) {
271271
@Override
272272
public ByteBuffer internalNioBuffer(int index, int length) {
273273
checkIndex(index, length);
274-
return buffer.internalNioBuffer(index + adjustment, length).duplicate();
274+
return nioBuffer(index, length);
275275
}
276276

277277
@Override

0 commit comments

Comments
 (0)