From 509edd86f405fc749bdafad8ea86d9866bf7a102 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Fri, 30 Sep 2011 22:14:36 +0200 Subject: [PATCH] Add patch of NETTY-434 to the mix to fix Deadlock in ChunkedWriteHandler. This patch was not written by me... --- .../handler/stream/ChunkedWriteHandler.java | 54 ++++++++++--------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/jboss/netty/handler/stream/ChunkedWriteHandler.java b/src/main/java/org/jboss/netty/handler/stream/ChunkedWriteHandler.java index 27b6cee87e..7ba9e35663 100644 --- a/src/main/java/org/jboss/netty/handler/stream/ChunkedWriteHandler.java +++ b/src/main/java/org/jboss/netty/handler/stream/ChunkedWriteHandler.java @@ -154,34 +154,36 @@ public class ChunkedWriteHandler implements ChannelUpstreamHandler, ChannelDowns private void discard(ChannelHandlerContext ctx) { ClosedChannelException cause = null; boolean fireExceptionCaught = false; - synchronized (this) { - for (;;) { - if (currentEvent == null) { - currentEvent = queue.poll(); - } - - if (currentEvent == null) { - break; - } - - MessageEvent currentEvent = this.currentEvent; - this.currentEvent = null; - - Object m = currentEvent.getMessage(); - if (m instanceof ChunkedInput) { - closeInput((ChunkedInput) m); - } - - // Trigger a ClosedChannelException - if (cause == null) { - cause = new ClosedChannelException(); - } - currentEvent.getFuture().setFailure(cause); - fireExceptionCaught = true; - - currentEvent = null; + + for (;;) { + MessageEvent currentEvent = this.currentEvent; + + if (this.currentEvent == null) { + currentEvent = queue.poll(); + } else { + this.currentEvent = null; } + + if (currentEvent == null) { + break; + } + + + Object m = currentEvent.getMessage(); + if (m instanceof ChunkedInput) { + closeInput((ChunkedInput) m); + } + + // Trigger a ClosedChannelException + if (cause == null) { + cause = new ClosedChannelException(); + } + currentEvent.getFuture().setFailure(cause); + fireExceptionCaught = true; + + currentEvent = null; } + if (fireExceptionCaught) { Channels.fireExceptionCaught(ctx.getChannel(), cause);