From e847ac0443ea1d7996b392d9adcfcd06e4094b78 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Mon, 30 May 2016 20:45:37 +0200 Subject: [PATCH] Fix possible deadlock in DefaultChannelPipeline.destroyDown(...) Motivation: We need to ensure we not hold a lock while executor callHandlerRemoved(...) as this may lead to a deadlock if handlerRemoved(...) will call another method in DEfaultChannelPipeline from another thread that will need to obtain the lock as well and wait for the result. Modifications: Release the lock before call handlerRemoved0(...). Result: No more deadlock possible --- .../src/main/java/io/netty/channel/DefaultChannelPipeline.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java b/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java index 141c498da0..a6abec7df4 100644 --- a/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java +++ b/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java @@ -858,8 +858,8 @@ public class DefaultChannelPipeline implements ChannelPipeline { if (inEventLoop || executor.inEventLoop(currentThread)) { synchronized (this) { remove0(ctx); - callHandlerRemoved0(ctx); } + callHandlerRemoved0(ctx); } else { final AbstractChannelHandlerContext finalCtx = ctx; executor.execute(new OneTimeTask() {