From d308fa8fe17d69c3bdb88bea8bf2a65b54a0758a Mon Sep 17 00:00:00 2001 From: norman Date: Fri, 4 May 2012 10:24:28 +0200 Subject: [PATCH] Fail all pending writes on channelClosed(..). See #305 --- .../java/io/netty/handler/ssl/SslHandler.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/handler/src/main/java/io/netty/handler/ssl/SslHandler.java b/handler/src/main/java/io/netty/handler/ssl/SslHandler.java index 2e7befe6ed..1bce7ff01d 100644 --- a/handler/src/main/java/io/netty/handler/ssl/SslHandler.java +++ b/handler/src/main/java/io/netty/handler/ssl/SslHandler.java @@ -1230,6 +1230,48 @@ public class SslHandler extends FrameDecoder super.channelConnected(ctx, e); } + /** + * Loop over all the pending writes and fail them. + * + * See #305 for more details. + */ + @Override + public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { + Throwable cause = null; + synchronized (pendingUnencryptedWrites) { + for (;;) { + PendingWrite pw = pendingUnencryptedWrites.poll(); + if (pw == null) { + break; + } + if (cause == null) { + cause = new ClosedChannelException(); + } + pw.future.setFailure(cause); + + } + + + for (;;) { + MessageEvent ev = pendingEncryptedWrites.poll(); + if (ev == null) { + break; + } + if (cause == null) { + cause = new ClosedChannelException(); + } + ev.getFuture().setFailure(cause); + + } + } + + if (cause != null) { + fireExceptionCaught(ctx, cause); + } + + super.channelClosed(ctx, e); + } + private final class SSLEngineInboundCloseFuture extends DefaultChannelFuture { public SSLEngineInboundCloseFuture() { super(null, true);