diff --git a/buffer/src/main/java/io/netty/buffer/ByteBufUtil.java b/buffer/src/main/java/io/netty/buffer/ByteBufUtil.java index 6456c9be66..9facf9de61 100644 --- a/buffer/src/main/java/io/netty/buffer/ByteBufUtil.java +++ b/buffer/src/main/java/io/netty/buffer/ByteBufUtil.java @@ -1151,9 +1151,9 @@ public final class ByteBufUtil { CharsetDecoder decoder = CharsetUtil.decoder(charset, CodingErrorAction.REPORT, CodingErrorAction.REPORT); try { if (buf.nioBufferCount() == 1) { - decoder.decode(buf.internalNioBuffer(index, length)); + decoder.decode(buf.nioBuffer(index, length)); } else { - ByteBuf heapBuffer = buf.alloc().heapBuffer(length); + ByteBuf heapBuffer = buf.alloc().heapBuffer(length); try { heapBuffer.writeBytes(buf, index, length); decoder.decode(heapBuffer.internalNioBuffer(heapBuffer.readerIndex(), length)); diff --git a/buffer/src/test/java/io/netty/buffer/ByteBufUtilTest.java b/buffer/src/test/java/io/netty/buffer/ByteBufUtilTest.java index f52c0fa4d7..160610b593 100644 --- a/buffer/src/test/java/io/netty/buffer/ByteBufUtilTest.java +++ b/buffer/src/test/java/io/netty/buffer/ByteBufUtilTest.java @@ -19,10 +19,15 @@ import io.netty.util.AsciiString; import io.netty.util.CharsetUtil; import org.junit.Test; +import java.nio.Buffer; import java.nio.ByteOrder; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.Random; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; import static io.netty.buffer.Unpooled.unreleasableBuffer; import static org.junit.Assert.assertArrayEquals; @@ -551,4 +556,44 @@ public class ByteBufUtilTest { buffer.release(); } } + + @Test + public void testIsTextMultiThreaded() throws Throwable { + final ByteBuf buffer = Unpooled.copiedBuffer("Hello, World!", CharsetUtil.ISO_8859_1); + + try { + final AtomicInteger counter = new AtomicInteger(60000); + final AtomicReference errorRef = new AtomicReference(); + List threads = new ArrayList(); + for (int i = 0; i < 10; i++) { + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + try { + while (errorRef.get() == null && counter.decrementAndGet() > 0) { + assertTrue(ByteBufUtil.isText(buffer, CharsetUtil.ISO_8859_1)); + } + } catch (Throwable cause) { + errorRef.compareAndSet(null, cause); + } + } + }); + threads.add(thread); + } + for (Thread thread : threads) { + thread.start(); + } + + for (Thread thread : threads) { + thread.join(); + } + + Throwable error = errorRef.get(); + if (error != null) { + throw error; + } + } finally { + buffer.release(); + } + } }