Author: markt Date: Fri Oct 4 11:21:42 2013 New Revision: 1529132 URL: http://svn.apache.org/r1529132 Log: Add a dispatch parameter to the newly renamed processSocket() method and align BIO and APR with NIO that executes the SocketProcessor in-line if no Executor is available
Modified: tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java tomcat/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Modified: tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java?rev=1529132&r1=1529131&r2=1529132&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java Fri Oct 4 11:21:42 2013 @@ -522,12 +522,12 @@ public abstract class AbstractAjpProcess } else if (actionCode == ActionCode.ASYNC_COMPLETE) { socketWrapper.clearDispatches(); if (asyncStateMachine.asyncComplete()) { - endpoint.processSocket(socketWrapper, SocketStatus.OPEN_READ); + endpoint.processSocket(socketWrapper, SocketStatus.OPEN_READ, true); } } else if (actionCode == ActionCode.ASYNC_DISPATCH) { if (asyncStateMachine.asyncDispatch()) { - endpoint.processSocket(socketWrapper, SocketStatus.OPEN_READ); + endpoint.processSocket(socketWrapper, SocketStatus.OPEN_READ, true); } } else if (actionCode == ActionCode.ASYNC_DISPATCHED) { Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java?rev=1529132&r1=1529131&r2=1529132&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java Fri Oct 4 11:21:42 2013 @@ -464,14 +464,14 @@ public class Http11AprProcessor extends comet = false; } else if (actionCode == ActionCode.COMET_CLOSE) { ((AprEndpoint)endpoint).processSocket(this.socketWrapper, - SocketStatus.OPEN_READ); + SocketStatus.OPEN_READ, true); } else if (actionCode == ActionCode.COMET_SETTIMEOUT) { //no op } else if (actionCode == ActionCode.ASYNC_COMPLETE) { socketWrapper.clearDispatches(); if (asyncStateMachine.asyncComplete()) { ((AprEndpoint)endpoint).processSocket(this.socketWrapper, - SocketStatus.OPEN_READ); + SocketStatus.OPEN_READ, true); } } else if (actionCode == ActionCode.ASYNC_SETTIMEOUT) { if (param==null) { @@ -482,7 +482,7 @@ public class Http11AprProcessor extends } else if (actionCode == ActionCode.ASYNC_DISPATCH) { if (asyncStateMachine.asyncDispatch()) { ((AprEndpoint)endpoint).processSocket(this.socketWrapper, - SocketStatus.OPEN_READ); + SocketStatus.OPEN_READ, true); } } Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java?rev=1529132&r1=1529131&r2=1529132&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java Fri Oct 4 11:21:42 2013 @@ -372,7 +372,7 @@ public class Http11Processor extends Abs socketWrapper.clearDispatches(); if (asyncStateMachine.asyncComplete()) { ((JIoEndpoint) endpoint).processSocket(this.socketWrapper, - SocketStatus.OPEN_READ); + SocketStatus.OPEN_READ, true); } } else if (actionCode == ActionCode.ASYNC_SETTIMEOUT) { if (param == null) return; @@ -382,7 +382,7 @@ public class Http11Processor extends Abs } else if (actionCode == ActionCode.ASYNC_DISPATCH) { if (asyncStateMachine.asyncDispatch()) { ((JIoEndpoint) endpoint).processSocket(this.socketWrapper, - SocketStatus.OPEN_READ); + SocketStatus.OPEN_READ, true); } } } Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java?rev=1529132&r1=1529131&r2=1529132&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java Fri Oct 4 11:21:42 2013 @@ -628,9 +628,11 @@ public abstract class AbstractEndpoint<S * * @param socketWrapper The socket wrapper to process * @param socketStatus The input status to the processing + * @param dispatch Should the processing be performed on a new + * container thread */ public abstract void processSocket(SocketWrapper<S> socketWrapper, - SocketStatus socketStatus); + SocketStatus socketStatus, boolean dispatch); // ------------------------------------------------------- Lifecycle methods Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=1529132&r1=1529131&r2=1529132&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Fri Oct 4 11:21:42 2013 @@ -852,36 +852,35 @@ public class AprEndpoint extends Abstrac @Override - public void processSocket(SocketWrapper<Long> socket, SocketStatus status) { + public void processSocket(SocketWrapper<Long> socket, SocketStatus status, + boolean dispatch) { try { if (waitingRequests.remove(socket)) { SocketProcessor proc = new SocketProcessor(socket, status); - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - try { - //threads should not be created by the webapp classloader - if (Constants.IS_SECURITY_ENABLED) { - PrivilegedAction<Void> pa = new PrivilegedSetTccl( - getClass().getClassLoader()); - AccessController.doPrivileged(pa); - } else { - Thread.currentThread().setContextClassLoader( - getClass().getClassLoader()); - } - Executor executor = getExecutor(); - if (executor == null) { - log.warn(sm.getString("endpoint.warn.noExector", - socket, status)); - return; - } else { + Executor executor = getExecutor(); + if (dispatch && executor != null) { + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + try { + //threads should not be created by the webapp classloader + if (Constants.IS_SECURITY_ENABLED) { + PrivilegedAction<Void> pa = new PrivilegedSetTccl( + getClass().getClassLoader()); + AccessController.doPrivileged(pa); + } else { + Thread.currentThread().setContextClassLoader( + getClass().getClassLoader()); + } executor.execute(proc); + } finally { + if (Constants.IS_SECURITY_ENABLED) { + PrivilegedAction<Void> pa = new PrivilegedSetTccl(loader); + AccessController.doPrivileged(pa); + } else { + Thread.currentThread().setContextClassLoader(loader); + } } - } finally { - if (Constants.IS_SECURITY_ENABLED) { - PrivilegedAction<Void> pa = new PrivilegedSetTccl(loader); - AccessController.doPrivileged(pa); - } else { - Thread.currentThread().setContextClassLoader(loader); - } + } else { + proc.run(); } } } catch (RejectedExecutionException ree) { @@ -1062,7 +1061,7 @@ public class AprEndpoint extends Abstrac long access = socket.getLastAccess(); if (socket.getTimeout() > 0 && (now-access)>socket.getTimeout()) { - processSocket(socket,SocketStatus.TIMEOUT); + processSocket(socket, SocketStatus.TIMEOUT, true); } } } Modified: tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java?rev=1529132&r1=1529131&r2=1529132&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java Fri Oct 4 11:21:42 2013 @@ -26,6 +26,7 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Iterator; import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.Executor; import java.util.concurrent.RejectedExecutionException; import org.apache.juli.logging.Log; @@ -169,7 +170,7 @@ public class JIoEndpoint extends Abstrac long access = socket.getLastAccess(); if (socket.getTimeout() > 0 && (now-access)>socket.getTimeout()) { - processSocket(socket,SocketStatus.TIMEOUT); + processSocket(socket, SocketStatus.TIMEOUT, true); } } @@ -549,44 +550,41 @@ public class JIoEndpoint extends Abstrac } - /** - * Process an existing async connection. If processing is required, passes - * the wrapped socket to an executor for processing. - * - * @param socket The socket associated with the client. - * @param status Only OPEN and TIMEOUT are used. The others are used for - * Comet requests that are not supported by the BIO (JIO) - * Connector. - */ @Override public void processSocket(SocketWrapper<Socket> socket, - SocketStatus status) { + SocketStatus status, boolean dispatch) { try { if (waitingRequests.remove(socket)) { SocketProcessor proc = new SocketProcessor(socket,status); - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - try { - //threads should not be created by the webapp classloader - if (Constants.IS_SECURITY_ENABLED) { - PrivilegedAction<Void> pa = new PrivilegedSetTccl( - getClass().getClassLoader()); - AccessController.doPrivileged(pa); - } else { - Thread.currentThread().setContextClassLoader( - getClass().getClassLoader()); - } - // During shutdown, executor may be null - avoid NPE - if (!running) { - return; - } - getExecutor().execute(proc); - } finally { - if (Constants.IS_SECURITY_ENABLED) { - PrivilegedAction<Void> pa = new PrivilegedSetTccl(loader); - AccessController.doPrivileged(pa); - } else { - Thread.currentThread().setContextClassLoader(loader); + Executor executor = getExecutor(); + if (dispatch && executor != null) { + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + try { + //threads should not be created by the webapp classloader + if (Constants.IS_SECURITY_ENABLED) { + PrivilegedAction<Void> pa = + new PrivilegedSetTccl( + getClass().getClassLoader()); + AccessController.doPrivileged(pa); + } else { + Thread.currentThread().setContextClassLoader( + getClass().getClassLoader()); + } + // During shutdown, executor may be null - avoid NPE + if (!running) { + return; + } + getExecutor().execute(proc); + } finally { + if (Constants.IS_SECURITY_ENABLED) { + PrivilegedAction<Void> pa = new PrivilegedSetTccl(loader); + AccessController.doPrivileged(pa); + } else { + Thread.currentThread().setContextClassLoader(loader); + } } + } else { + proc.run(); } } } catch (RejectedExecutionException ree) { 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=1529132&r1=1529131&r2=1529132&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Fri Oct 4 11:21:42 2013 @@ -37,6 +37,7 @@ import java.security.PrivilegedAction; import java.util.Iterator; import java.util.Set; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Executor; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; @@ -605,8 +606,8 @@ public class NioEndpoint extends Abstrac @Override public void processSocket(SocketWrapper<NioChannel> socketWrapper, - SocketStatus socketStatus) { - dispatchForEvent(socketWrapper.getSocket(), socketStatus, true); + SocketStatus socketStatus, boolean dispatch) { + dispatchForEvent(socketWrapper.getSocket(), socketStatus, dispatch); } public boolean dispatchForEvent(NioChannel socket, SocketStatus status, boolean dispatch) { @@ -628,7 +629,8 @@ public class NioEndpoint extends Abstrac SocketProcessor sc = processorCache.pop(); if ( sc == null ) sc = new SocketProcessor(socket,status); else sc.reset(socket,status); - if (dispatch && getExecutor() != null) { + Executor executor = getExecutor(); + if (dispatch && executor != null) { ClassLoader loader = Thread.currentThread().getContextClassLoader(); try { //threads should not be created by the webapp classloader @@ -640,7 +642,7 @@ public class NioEndpoint extends Abstrac Thread.currentThread().setContextClassLoader( getClass().getClassLoader()); } - getExecutor().execute(sc); + executor.execute(sc); } finally { if (Constants.IS_SECURITY_ENABLED) { PrivilegedAction<Void> pa = new PrivilegedSetTccl(loader); --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org