Author: markt
Date: Wed Nov  4 10:55:12 2015
New Revision: 1712529

URL: http://svn.apache.org/viewvc?rev=1712529&view=rev
Log:
Follow-up to r1712081.
Comet is not-blocking too, so it also needs to trigger a read on a call to 
available() if no bytes are in the buffer

Modified:
    tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
    tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java
    tomcat/tc8.0.x/trunk/java/org/apache/catalina/core/StandardWrapperValve.java
    tomcat/tc8.0.x/trunk/java/org/apache/coyote/ActionCode.java
    tomcat/tc8.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java
    
tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java?rev=1712529&r1=1712528&r2=1712529&view=diff
==============================================================================
--- tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java 
(original)
+++ tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java 
Wed Nov  4 10:55:12 2015
@@ -519,15 +519,11 @@ public class CoyoteAdapter implements Ad
 
                 if (request.isComet()) {
                     if (!response.isClosed() && !response.isError()) {
+                        comet = true;
+                        res.action(ActionCode.COMET_BEGIN, null);
                         if (request.getAvailable() || 
(request.getContentLength() > 0 && (!request.isParametersParsed()))) {
                             // Invoke a read event right away if there are 
available bytes
-                            if (event(req, res, SocketStatus.OPEN_READ)) {
-                                comet = true;
-                                res.action(ActionCode.COMET_BEGIN, null);
-                            }
-                        } else {
-                            comet = true;
-                            res.action(ActionCode.COMET_BEGIN, null);
+                            event(req, res, SocketStatus.OPEN_READ);
                         }
                     } else {
                         // Clear the filter chain, as otherwise it will not be 
reset elsewhere
@@ -535,8 +531,8 @@ public class CoyoteAdapter implements Ad
                         request.setFilterChain(null);
                     }
                 }
-
             }
+
             AsyncContextImpl asyncConImpl = 
(AsyncContextImpl)request.getAsyncContext();
             if (asyncConImpl != null) {
                 async = true;

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java?rev=1712529&r1=1712528&r2=1712529&view=diff
==============================================================================
--- tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java 
(original)
+++ tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java 
Wed Nov  4 10:55:12 2015
@@ -22,6 +22,7 @@ import java.security.AccessController;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import javax.servlet.ReadListener;
 
@@ -241,7 +242,14 @@ public class InputBuffer extends Reader
             available = cb.getLength();
         }
         if (available == 0) {
-            coyoteRequest.action(ActionCode.AVAILABLE, 
Boolean.valueOf(coyoteRequest.getReadListener() != null));
+            // Written this way to avoid use of IS_COMET action where possible
+            boolean readForAvailable = coyoteRequest.getReadListener() != null;
+            if (!readForAvailable) {
+                AtomicBoolean isComet = new AtomicBoolean();
+                coyoteRequest.action(ActionCode.IS_COMET, isComet);
+                readForAvailable = isComet.get();
+            }
+            coyoteRequest.action(ActionCode.AVAILABLE, 
Boolean.valueOf(readForAvailable));
             available = (coyoteRequest.getAvailable() > 0) ? 1 : 0;
         }
         return available;

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/core/StandardWrapperValve.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/core/StandardWrapperValve.java?rev=1712529&r1=1712528&r2=1712529&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/core/StandardWrapperValve.java 
(original)
+++ 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/core/StandardWrapperValve.java 
Wed Nov  4 10:55:12 2015
@@ -181,9 +181,6 @@ final class StandardWrapperValve
         ApplicationFilterChain filterChain =
                 ApplicationFilterFactory.createFilterChain(request, wrapper, 
servlet);
 
-        // Reset comet flag value after creating the filter chain
-        request.setComet(false);
-
         // Call the filter chain for this request
         // NOTE: This also calls the servlet's service() method
         try {
@@ -196,7 +193,6 @@ final class StandardWrapperValve
                             
((AsyncContextImpl)request.getAsyncContext()).doInternalDispatch();
                         } else if (comet) {
                             filterChain.doFilterEvent(request.getEvent());
-                            request.setComet(true);
                         } else {
                             filterChain.doFilter(request.getRequest(),
                                     response.getResponse());
@@ -211,7 +207,6 @@ final class StandardWrapperValve
                     if (request.isAsyncDispatching()) {
                         
((AsyncContextImpl)request.getAsyncContext()).doInternalDispatch();
                     } else if (comet) {
-                        request.setComet(true);
                         filterChain.doFilterEvent(request.getEvent());
                     } else {
                         filterChain.doFilter

Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/ActionCode.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/ActionCode.java?rev=1712529&r1=1712528&r2=1712529&view=diff
==============================================================================
--- tomcat/tc8.0.x/trunk/java/org/apache/coyote/ActionCode.java (original)
+++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/ActionCode.java Wed Nov  4 
10:55:12 2015
@@ -135,6 +135,11 @@ public enum ActionCode {
     COMET_SETTIMEOUT,
 
     /**
+     * Callback to determine if the current request is a Comet request.
+     */
+    IS_COMET,
+
+    /**
      * Callback for an async request.
      */
     ASYNC_START,

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java?rev=1712529&r1=1712528&r2=1712529&view=diff
==============================================================================
--- tomcat/tc8.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java 
(original)
+++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java 
Wed Nov  4 10:55:12 2015
@@ -617,6 +617,11 @@ public abstract class AbstractAjpProcess
             throw new UnsupportedOperationException(
                     sm.getString("ajpprocessor.comet.notsupported"));
         }
+        case IS_COMET: {
+            // HTTP connections only. Unsupported for AJP.
+            throw new UnsupportedOperationException(
+                    sm.getString("ajpprocessor.comet.notsupported"));
+        }
         case AVAILABLE: {
             if (available()) {
                 request.setAvailable(1);

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java?rev=1712529&r1=1712528&r2=1712529&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java 
(original)
+++ 
tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java 
Wed Nov  4 10:55:12 2015
@@ -920,6 +920,11 @@ public abstract class AbstractHttp11Proc
             endRequest();
             break;
         }
+        case IS_COMET: {
+            AtomicBoolean result = (AtomicBoolean) param;
+            result.set(isComet());
+            break;
+        }
         default: {
             actionInternal(actionCode, param);
             break;



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

Reply via email to