Author: fhanik
Date: Thu Aug  6 16:25:04 2009
New Revision: 801705

URL: http://svn.apache.org/viewvc?rev=801705&view=rev
Log:
If dispatch is called on a worker thread, simply execute it, instead of 
throwing exception. No need to hand off to container


Modified:
    tomcat/trunk/java/org/apache/catalina/connector/AsyncContextImpl.java
    tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java

Modified: tomcat/trunk/java/org/apache/catalina/connector/AsyncContextImpl.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/AsyncContextImpl.java?rev=801705&r1=801704&r2=801705&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/AsyncContextImpl.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/connector/AsyncContextImpl.java Thu 
Aug  6 16:25:04 2009
@@ -122,7 +122,17 @@
                 }
             };
             this.dispatch = run;
-            request.coyoteRequest.action(ActionCode.ACTION_ASYNC_DISPATCH, 
null );
+            AtomicBoolean dispatched = new AtomicBoolean(false);
+            request.coyoteRequest.action(ActionCode.ACTION_ASYNC_DISPATCH, 
dispatched );
+            if (!dispatched.get()) {
+                try {
+                    doInternalDispatch();
+                }catch (ServletException sx) {
+                    throw new RuntimeException(sx);
+                }catch (IOException ix) {
+                    throw new RuntimeException(ix);
+                }
+            }
 
         } else {
             throw new IllegalStateException("Dispatch not allowed. Invalid 
state:"+state.get());
@@ -154,7 +164,17 @@
                 }
             };
             this.dispatch = r;
-            request.coyoteRequest.action(ActionCode.ACTION_ASYNC_DISPATCH, 
null );
+            AtomicBoolean dispatched = new AtomicBoolean(false);
+            request.coyoteRequest.action(ActionCode.ACTION_ASYNC_DISPATCH, 
dispatched );
+            if (!dispatched.get()) {
+                try {
+                    doInternalDispatch();
+                }catch (ServletException sx) {
+                    throw new RuntimeException(sx);
+                }catch (IOException ix) {
+                    throw new RuntimeException(ix);
+                }
+            }
         } else {
             throw new IllegalStateException("Dispatch not allowed. Invalid 
state:"+state.get());
         }

Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java?rev=801705&r1=801704&r2=801705&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java 
(original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java Thu Aug  
6 16:25:04 2009
@@ -1323,10 +1323,11 @@
             attach.setTimeout(timeout);
         } else if (actionCode == ActionCode.ACTION_ASYNC_DISPATCH) {
             RequestInfo rp = request.getRequestProcessor();
+            AtomicBoolean dispatch = (AtomicBoolean)param;
             if ( rp.getStage() != org.apache.coyote.Constants.STAGE_SERVICE ) 
{//async handling
                 endpoint.processSocket(this.socket, SocketStatus.OPEN, true);
             } else { 
-                throw new UnsupportedOperationException("Can't call dispatch 
on the worker thread.");
+                dispatch.set(true);
             }
         }
     }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to