Author: markt Date: Wed Sep 26 20:09:35 2012 New Revision: 1390714 URL: http://svn.apache.org/viewvc?rev=1390714&view=rev Log: Switch to SynchronizedQueue for the event queues Switch to SynchronizedStack for the Processor cache These changes together reduce object allocation during my load test by ~22% compared to prior to these changes
Modified: tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java tomcat/trunk/java/org/apache/coyote/ajp/AjpNioProtocol.java tomcat/trunk/java/org/apache/coyote/ajp/AjpProtocol.java tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java tomcat/trunk/java/org/apache/coyote/http11/Http11Protocol.java tomcat/trunk/java/org/apache/tomcat/util/collections/SynchronizedStack.java tomcat/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Modified: tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java?rev=1390714&r1=1390713&r2=1390714&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java Wed Sep 26 20:09:35 2012 @@ -19,7 +19,6 @@ package org.apache.coyote; import java.io.IOException; import java.net.InetAddress; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; @@ -35,6 +34,7 @@ import org.apache.coyote.http11.upgrade. import org.apache.coyote.http11.upgrade.UpgradeProcessor; import org.apache.juli.logging.Log; import org.apache.tomcat.util.ExceptionUtils; +import org.apache.tomcat.util.collections.SynchronizedStack; import org.apache.tomcat.util.modeler.Registry; import org.apache.tomcat.util.net.AbstractEndpoint; import org.apache.tomcat.util.net.AbstractEndpoint.Handler; @@ -595,7 +595,7 @@ public abstract class AbstractProtocol i try { if (processor == null) { - processor = recycledProcessors.poll(); + processor = recycledProcessors.pop(); } if (processor == null) { processor = createProcessor(); @@ -750,9 +750,8 @@ public abstract class AbstractProtocol i } protected static class RecycledProcessors<P extends Processor<S>, S> - extends ConcurrentLinkedQueue<Processor<S>> { + extends SynchronizedStack<Processor<S>> { - private static final long serialVersionUID = 1L; private final transient AbstractConnectionHandler<S,P> handler; protected final AtomicInteger size = new AtomicInteger(0); @@ -761,13 +760,13 @@ public abstract class AbstractProtocol i } @Override - public boolean offer(Processor<S> processor) { + public boolean push(Processor<S> processor) { int cacheSize = handler.getProtocol().getProcessorCache(); boolean offer = cacheSize == -1 ? true : size.get() < cacheSize; //avoid over growing our cache or add after we have stopped boolean result = false; if (offer) { - result = super.offer(processor); + result = super.push(processor); if (result) { size.incrementAndGet(); } @@ -777,8 +776,8 @@ public abstract class AbstractProtocol i } @Override - public Processor<S> poll() { - Processor<S> result = super.poll(); + public Processor<S> pop() { + Processor<S> result = super.pop(); if (result != null) { size.decrementAndGet(); } @@ -787,10 +786,10 @@ public abstract class AbstractProtocol i @Override public void clear() { - Processor<S> next = poll(); + Processor<S> next = pop(); while (next != null) { handler.unregister(next); - next = poll(); + next = pop(); } super.clear(); size.set(0); Modified: tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java?rev=1390714&r1=1390713&r2=1390714&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java Wed Sep 26 20:09:35 2012 @@ -131,7 +131,7 @@ public class AjpAprProtocol extends Abst Processor<Long> processor, boolean isSocketClosing, boolean addToPoller) { processor.recycle(isSocketClosing); - recycledProcessors.offer(processor); + recycledProcessors.push(processor); if (addToPoller) { ((AprEndpoint)proto.endpoint).getPoller().add( socket.getSocket().longValue(), Modified: tomcat/trunk/java/org/apache/coyote/ajp/AjpNioProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AjpNioProtocol.java?rev=1390714&r1=1390713&r2=1390714&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/ajp/AjpNioProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/ajp/AjpNioProtocol.java Wed Sep 26 20:09:35 2012 @@ -149,7 +149,7 @@ public class AjpNioProtocol extends Abst Processor<NioChannel> processor = connections.remove(socket); if (processor != null) { processor.recycle(true); - recycledProcessors.offer(processor); + recycledProcessors.push(processor); } } @@ -162,7 +162,7 @@ public class AjpNioProtocol extends Abst Processor<NioChannel> processor, boolean isSocketClosing, boolean addToPoller) { processor.recycle(isSocketClosing); - recycledProcessors.offer(processor); + recycledProcessors.push(processor); if (addToPoller) { socket.getSocket().getPoller().add(socket.getSocket()); } Modified: tomcat/trunk/java/org/apache/coyote/ajp/AjpProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AjpProtocol.java?rev=1390714&r1=1390713&r2=1390714&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/ajp/AjpProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/ajp/AjpProtocol.java Wed Sep 26 20:09:35 2012 @@ -125,7 +125,7 @@ public class AjpProtocol extends Abstrac Processor<Socket> processor, boolean isSocketClosing, boolean addToPoller) { processor.recycle(isSocketClosing); - recycledProcessors.offer(processor); + recycledProcessors.push(processor); } Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java?rev=1390714&r1=1390713&r2=1390714&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java Wed Sep 26 20:09:35 2012 @@ -247,7 +247,7 @@ public class Http11AprProtocol extends A Processor<Long> processor, boolean isSocketClosing, boolean addToPoller) { processor.recycle(isSocketClosing); - recycledProcessors.offer(processor); + recycledProcessors.push(processor); if (addToPoller && proto.endpoint.isRunning()) { ((AprEndpoint)proto.endpoint).getPoller().add( socket.getSocket().longValue(), Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java?rev=1390714&r1=1390713&r2=1390714&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java Wed Sep 26 20:09:35 2012 @@ -207,7 +207,7 @@ public class Http11NioProtocol extends A connections.remove(socket.getSocket()); if (processor != null) { processor.recycle(true); - recycledProcessors.offer(processor); + recycledProcessors.push(processor); } } @@ -238,7 +238,7 @@ public class Http11NioProtocol extends A Processor<NioChannel> processor, boolean isSocketClosing, boolean addToPoller) { processor.recycle(isSocketClosing); - recycledProcessors.offer(processor); + recycledProcessors.push(processor); if (addToPoller) { socket.getSocket().getPoller().add(socket.getSocket()); } Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11Protocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11Protocol.java?rev=1390714&r1=1390713&r2=1390714&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11Protocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11Protocol.java Wed Sep 26 20:09:35 2012 @@ -159,7 +159,7 @@ public class Http11Protocol extends Abst Processor<Socket> processor, boolean isSocketClosing, boolean addToPoller) { processor.recycle(isSocketClosing); - recycledProcessors.offer(processor); + recycledProcessors.push(processor); } @Override Modified: tomcat/trunk/java/org/apache/tomcat/util/collections/SynchronizedStack.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/collections/SynchronizedStack.java?rev=1390714&r1=1390713&r2=1390714&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/collections/SynchronizedStack.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/collections/SynchronizedStack.java Wed Sep 26 20:09:35 2012 @@ -50,17 +50,18 @@ public class SynchronizedStack<T> { } - public synchronized void push(T obj) { + public synchronized boolean push(T obj) { index++; if (index == size) { if (limit == -1 || size < limit) { expand(); } else { index--; - return; + return false; } } stack[index] = obj; + return true; } @SuppressWarnings("unchecked") 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=1390714&r1=1390713&r2=1390714&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java Wed Sep 26 20:09:35 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.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; @@ -34,6 +33,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.SynchronizedQueue; import org.apache.tomcat.util.collections.SynchronizedStack; import org.apache.tomcat.util.net.NioEndpoint.KeyAttachment; @@ -215,8 +215,8 @@ public class NioBlockingSelector { protected static class BlockPoller extends Thread { protected volatile boolean run = true; protected Selector selector = null; - protected final ConcurrentLinkedQueue<Runnable> events = - new ConcurrentLinkedQueue<>(); + protected final SynchronizedQueue<Runnable> events = + new SynchronizedQueue<>(); public void disable() { run = false; selector.wakeup();} protected final AtomicInteger wakeupCounter = new AtomicInteger(0); public void cancelKey(final SelectionKey key) { @@ -414,5 +414,4 @@ public class NioBlockingSelector { key = null; } } - } Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?rev=1390714&r1=1390713&r2=1390714&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Wed Sep 26 20:09:35 2012 @@ -34,7 +34,6 @@ import java.nio.channels.SocketChannel; import java.nio.channels.WritableByteChannel; import java.util.Iterator; import java.util.Set; -import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.TimeUnit; @@ -51,6 +50,7 @@ import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.ExceptionUtils; import org.apache.tomcat.util.IntrospectionUtils; +import org.apache.tomcat.util.collections.SynchronizedQueue; import org.apache.tomcat.util.collections.SynchronizedStack; import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; import org.apache.tomcat.util.net.SecureNioChannel.ApplicationBufferHandler; @@ -837,8 +837,8 @@ public class NioEndpoint extends Abstrac public class Poller implements Runnable { protected Selector selector; - protected ConcurrentLinkedQueue<Runnable> events = - new ConcurrentLinkedQueue<>(); + protected final SynchronizedQueue<Runnable> events = + new SynchronizedQueue<>(); protected volatile boolean close = false; protected long nextExpiration = 0;//optimize expiration handling --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org