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: [email protected]
For additional commands, e-mail: [email protected]