diff --git a/transport/src/main/java/io/netty/channel/DefaultChannelHandlerContext.java b/transport/src/main/java/io/netty/channel/DefaultChannelHandlerContext.java index 91c5260df1..0a1b8b506a 100755 --- a/transport/src/main/java/io/netty/channel/DefaultChannelHandlerContext.java +++ b/transport/src/main/java/io/netty/channel/DefaultChannelHandlerContext.java @@ -706,7 +706,7 @@ final class DefaultChannelHandlerContext extends DefaultAttributeMap implements if (executor().inEventLoop(currentThread)) { ByteBridge bridge = ctx.inByteBridge; if (bridge == null) { - bridge = new ByteBridge(ctx); + bridge = new ByteBridge(ctx, true); if (!IN_BYTE_BRIDGE_UPDATER.compareAndSet(ctx, null, bridge)) { // release it as it was set before bridge.release(); @@ -762,7 +762,7 @@ final class DefaultChannelHandlerContext extends DefaultAttributeMap implements if (executor().inEventLoop(currentThread)) { ByteBridge bridge = ctx.outByteBridge; if (bridge == null) { - bridge = new ByteBridge(ctx); + bridge = new ByteBridge(ctx, false); if (!OUT_BYTE_BRIDGE_UPDATER.compareAndSet(ctx, null, bridge)) { // release it as it was set before bridge.release(); @@ -1703,10 +1703,21 @@ final class DefaultChannelHandlerContext extends DefaultAttributeMap implements private final Queue exchangeBuf = new ConcurrentLinkedQueue(); private final ChannelHandlerContext ctx; - ByteBridge(ChannelHandlerContext ctx) { + ByteBridge(ChannelHandlerContext ctx, boolean inbound) { this.ctx = ctx; - // TODO Choose whether to use heap or direct buffer depending on the context's buffer type. - byteBuf = ctx.alloc().buffer(); + if (inbound) { + if (ctx.inboundByteBuffer().isDirect()) { + byteBuf = ctx.alloc().directBuffer(); + } else { + byteBuf = ctx.alloc().heapBuffer(); + } + } else { + if (ctx.outboundByteBuffer().isDirect()) { + byteBuf = ctx.alloc().directBuffer(); + } else { + byteBuf = ctx.alloc().heapBuffer(); + } + } } private void fill() {