diff --git a/src/main/java/org/jboss/netty/handler/execution/OrderedMemoryAwareThreadPoolExecutor.java b/src/main/java/org/jboss/netty/handler/execution/OrderedMemoryAwareThreadPoolExecutor.java index 49782774d0..bf1392ab7a 100644 --- a/src/main/java/org/jboss/netty/handler/execution/OrderedMemoryAwareThreadPoolExecutor.java +++ b/src/main/java/org/jboss/netty/handler/execution/OrderedMemoryAwareThreadPoolExecutor.java @@ -30,6 +30,8 @@ import java.util.concurrent.TimeUnit; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelEvent; +import org.jboss.netty.channel.ChannelState; +import org.jboss.netty.channel.ChannelStateEvent; import org.jboss.netty.util.ObjectSizeEstimator; import org.jboss.netty.util.internal.ConcurrentIdentityWeakKeyHashMap; @@ -167,6 +169,15 @@ public class OrderedMemoryAwareThreadPoolExecutor extends executor = oldExecutor; } } + + // Remove the entry when the channel closes. + if (e instanceof ChannelStateEvent) { + ChannelStateEvent se = (ChannelStateEvent) e; + if (se.getState() == ChannelState.OPEN && + !channel.isOpen()) { + childExecutors.remove(channel); + } + } return executor; }