From f2eddda5a49fe8fa28ebf65c9121a95c292147d3 Mon Sep 17 00:00:00 2001 From: Trustin Lee Date: Thu, 31 May 2012 16:59:54 -0700 Subject: [PATCH] Call discardReadBytes() on outbound byte buffers when possible - Also fixed a test failure in codec-http --- .../src/main/java/io/netty/channel/AbstractChannel.java | 3 +++ .../src/main/java/io/netty/channel/DefaultChannelFuture.java | 2 +- .../main/java/io/netty/channel/DefaultChannelPipeline.java | 5 +++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/transport/src/main/java/io/netty/channel/AbstractChannel.java b/transport/src/main/java/io/netty/channel/AbstractChannel.java index 8fb4cd8d2a..bd54a95277 100644 --- a/transport/src/main/java/io/netty/channel/AbstractChannel.java +++ b/transport/src/main/java/io/netty/channel/AbstractChannel.java @@ -626,6 +626,9 @@ public abstract class AbstractChannel extends DefaultAttributeMap implements Cha cause = t; } finally { writeCounter += oldSize - out.size(); + if (out.isEmpty() && out.hasByteBuffer()) { + out.byteBuffer().discardReadBytes(); + } } if (cause == null) { diff --git a/transport/src/main/java/io/netty/channel/DefaultChannelFuture.java b/transport/src/main/java/io/netty/channel/DefaultChannelFuture.java index 247ef63d67..60c90664c1 100644 --- a/transport/src/main/java/io/netty/channel/DefaultChannelFuture.java +++ b/transport/src/main/java/io/netty/channel/DefaultChannelFuture.java @@ -323,7 +323,7 @@ public class DefaultChannelFuture extends FlushCheckpoint implements ChannelFutu } private void checkDeadLock() { - if (channel().eventLoop().inEventLoop()) { + if (channel().isRegistered() && channel().eventLoop().inEventLoop()) { throw new BlockingOperationException(); } } diff --git a/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java b/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java index 076da89e99..8ea65888b1 100644 --- a/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java +++ b/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java @@ -927,6 +927,11 @@ public class DefaultChannelPipeline implements ChannelPipeline { ((ChannelOutboundHandler) ctx.handler()).flush(ctx, future); } catch (Throwable t) { notifyHandlerException(t); + } finally { + ChannelBufferHolder outbound = ctx.outbound(); + if (!outbound.isBypass() && outbound.isEmpty() && outbound.hasByteBuffer()) { + outbound.byteBuffer().discardReadBytes(); + } } } else { channel().unsafe().flush(future);