You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/10/04 13:21:43 UTC
svn commit: r1529132 - in /tomcat/trunk/java/org/apache: coyote/ajp/
coyote/http11/ tomcat/util/net/
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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org