more work on the complete
authorfhanik <fhanik@13f79535-47bb-0310-9956-ffa450edef68>
Wed, 5 Aug 2009 21:16:47 +0000 (21:16 +0000)
committerfhanik <fhanik@13f79535-47bb-0310-9956-ffa450edef68>
Wed, 5 Aug 2009 21:16:47 +0000 (21:16 +0000)
git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@801414 13f79535-47bb-0310-9956-ffa450edef68

java/org/apache/catalina/connector/AsyncContextImpl.java
java/org/apache/coyote/http11/Http11NioProcessor.java

index 5526d49..caaa3b1 100644 (file)
@@ -19,6 +19,7 @@ package org.apache.catalina.connector;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 
 import javax.servlet.AsyncContext;
@@ -35,6 +36,7 @@ import org.apache.catalina.Context;
 import org.apache.coyote.ActionCode;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.MutableInteger;
 /**
  * 
  * @author fhanik
@@ -65,8 +67,12 @@ public class AsyncContextImpl implements AsyncContext {
 
     @Override
     public void complete() {
-        // TODO SERVLET3 - async
-        doInternalComplete(false);
+        if (state.compareAndSet(AsyncState.STARTED, AsyncState.COMPLETING)) {
+            // TODO SERVLET3 - async
+            AtomicBoolean dispatched = new AtomicBoolean(false);
+            request.coyoteRequest.action(ActionCode.ACTION_ASYNC_COMPLETE,dispatched);
+            if (!dispatched.get()) doInternalComplete(false);
+        }
     }
 
     @Override
@@ -221,9 +227,15 @@ public class AsyncContextImpl implements AsyncContext {
     
     public void doInternalDispatch() throws ServletException, IOException {
         if (this.state.compareAndSet(AsyncState.TIMING_OUT, AsyncState.DISPATCHED)) {
+            boolean listenerInvoked = false;
             for (AsyncListenerWrapper listener : listeners) {
                 listener.fireOnTimeout();
+                listenerInvoked = true;
+            }
+            if (!listenerInvoked) {
+                ((HttpServletResponse)servletResponse).setStatus(500);
             }
+            doInternalComplete(true);
         } else if (this.state.compareAndSet(AsyncState.DISPATCHING, AsyncState.DISPATCHED)) {
             if (this.dispatch!=null) {
                 try {
@@ -264,8 +276,8 @@ public class AsyncContextImpl implements AsyncContext {
             }catch (Exception x) {
                 log.error("",x);
             }
-            request.coyoteRequest.action(ActionCode.ACTION_ASYNC_COMPLETE,null);
             recycle();
+            
         } else { 
             throw new IllegalStateException("Complete illegal. Invalid state:"+state.get());
         }
index 8e4e4d4..266692a 100644 (file)
@@ -22,6 +22,7 @@ import java.io.InterruptedIOException;
 import java.net.InetAddress;
 import java.nio.channels.SelectionKey;
 import java.util.StringTokenizer;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 
@@ -1314,10 +1315,13 @@ public class Http11NioProcessor implements ActionHook {
             async = true;
         } else if (actionCode == ActionCode.ACTION_ASYNC_COMPLETE) {
           //TODO SERVLET3 - async
+            AtomicBoolean dispatch = (AtomicBoolean)param;
             asyncClose = true;
             RequestInfo rp = request.getRequestProcessor();
-            if ( rp.getStage() != org.apache.coyote.Constants.STAGE_SERVICE ) //async handling
-                socket.getPoller().cometInterest(socket);
+            if ( rp.getStage() != org.apache.coyote.Constants.STAGE_SERVICE ) { //async handling
+                dispatch.set(true);
+                endpoint.processSocket(this.socket, SocketStatus.STOP, true);
+            }
         } else if (actionCode == ActionCode.ACTION_ASYNC_SETTIMEOUT) {
           //TODO SERVLET3 - async
             if (param==null) return;