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