Fixed issue: NETTY-166 Dead lock triggered by OIO transport and MemoryAwareThreadPoolExecutor when WriteCompletionEvent reaches memory limit

* MemoryAwareThreadPoolExecutor does not count WriteCompletionEvent anymore to avoid dead lock
This commit is contained in:
Trustin Lee 2009-06-05 07:05:20 +00:00
parent 663fe81af2
commit 7339e172e0

View File

@ -41,6 +41,7 @@ import org.jboss.netty.channel.ChannelEvent;
import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelState; import org.jboss.netty.channel.ChannelState;
import org.jboss.netty.channel.ChannelStateEvent; import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.WriteCompletionEvent;
import org.jboss.netty.logging.InternalLogger; import org.jboss.netty.logging.InternalLogger;
import org.jboss.netty.logging.InternalLoggerFactory; import org.jboss.netty.logging.InternalLoggerFactory;
import org.jboss.netty.util.DefaultObjectSizeEstimator; import org.jboss.netty.util.DefaultObjectSizeEstimator;
@ -307,7 +308,7 @@ public class MemoryAwareThreadPoolExecutor extends ThreadPoolExecutor {
boolean pause = increaseCounter(command); boolean pause = increaseCounter(command);
doExecute(command); doExecute(command);
if (pause) { if (pause) {
//System.out.println("ACQUIRE"); //System.out.println("ACQUIRE: " + command);
semaphore.acquireUninterruptibly(); semaphore.acquireUninterruptibly();
} }
} }
@ -399,7 +400,7 @@ public class MemoryAwareThreadPoolExecutor extends ThreadPoolExecutor {
//System.out.println("D: " + totalCounter + ", " + increment); //System.out.println("D: " + totalCounter + ", " + increment);
if (maxTotalMemorySize != 0 && totalCounter + increment >= maxTotalMemorySize) { if (maxTotalMemorySize != 0 && totalCounter + increment >= maxTotalMemorySize) {
//System.out.println("RELEASE"); //System.out.println("RELEASE: " + task);
semaphore.release(); semaphore.release();
} }
@ -448,9 +449,11 @@ public class MemoryAwareThreadPoolExecutor extends ThreadPoolExecutor {
protected boolean shouldCount(Runnable task) { protected boolean shouldCount(Runnable task) {
if (task instanceof ChannelEventRunnable) { if (task instanceof ChannelEventRunnable) {
ChannelEventRunnable r = (ChannelEventRunnable) task; ChannelEventRunnable r = (ChannelEventRunnable) task;
if (r.getEvent() instanceof ChannelStateEvent) { ChannelEvent e = r.getEvent();
ChannelStateEvent e = (ChannelStateEvent) r.getEvent(); if (e instanceof WriteCompletionEvent) {
if (e.getState() == ChannelState.INTEREST_OPS) { return false;
} else if (e instanceof ChannelStateEvent) {
if (((ChannelStateEvent) e).getState() == ChannelState.INTEREST_OPS) {
return false; return false;
} }
} }