Author: markt Date: Sun Sep 23 18:15:19 2012 New Revision: 1389110 URL: http://svn.apache.org/viewvc?rev=1389110&view=rev Log: Switch to ConcurrentStack removing 17% of object allocation during load test
Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java?rev=1389110&r1=1389109&r2=1389110&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java Sun Sep 23 18:15:19 2012 @@ -26,7 +26,6 @@ import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.SocketChannel; import java.util.Iterator; -import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -35,6 +34,7 @@ import java.util.concurrent.atomic.Atomi import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.ExceptionUtils; +import org.apache.tomcat.util.collections.ConcurrentStack; import org.apache.tomcat.util.net.NioEndpoint.KeyAttachment; public class NioBlockingSelector { @@ -43,8 +43,8 @@ public class NioBlockingSelector { private static int threadCounter = 0; - private Queue<KeyReference> keyReferenceQueue = - new ConcurrentLinkedQueue<>(); + private ConcurrentStack<KeyReference> keyReferenceStack = + new ConcurrentStack<>(); protected Selector sharedSelector; @@ -86,7 +86,7 @@ public class NioBlockingSelector { throws IOException { SelectionKey key = socket.getIOChannel().keyFor(socket.getPoller().getSelector()); if ( key == null ) throw new IOException("Key no longer registered"); - KeyReference reference = keyReferenceQueue.poll(); + KeyReference reference = keyReferenceStack.pop(); if (reference == null) { reference = new KeyReference(); } @@ -138,7 +138,7 @@ public class NioBlockingSelector { poller.cancelKey(reference.key); } reference.key = null; - keyReferenceQueue.add(reference); + keyReferenceStack.push(reference); } return written; } @@ -158,7 +158,7 @@ public class NioBlockingSelector { public int read(ByteBuffer buf, NioChannel socket, long readTimeout) throws IOException { SelectionKey key = socket.getIOChannel().keyFor(socket.getPoller().getSelector()); if ( key == null ) throw new IOException("Key no longer registered"); - KeyReference reference = keyReferenceQueue.poll(); + KeyReference reference = keyReferenceStack.pop(); if (reference == null) { reference = new KeyReference(); } @@ -206,7 +206,7 @@ public class NioBlockingSelector { poller.cancelKey(reference.key); } reference.key = null; - keyReferenceQueue.add(reference); + keyReferenceStack.push(reference); } return read; } @@ -215,10 +215,10 @@ public class NioBlockingSelector { protected static class BlockPoller extends Thread { protected volatile boolean run = true; protected Selector selector = null; - protected ConcurrentLinkedQueue<Runnable> events = + protected final ConcurrentLinkedQueue<Runnable> events = new ConcurrentLinkedQueue<>(); public void disable() { run = false; selector.wakeup();} - protected AtomicInteger wakeupCounter = new AtomicInteger(0); + protected final AtomicInteger wakeupCounter = new AtomicInteger(0); public void cancelKey(final SelectionKey key) { Runnable r = new Runnable() { @Override --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org