Author: remm
Date: Fri Apr  4 20:48:55 2014
New Revision: 1584904

URL: http://svn.apache.org/r1584904
Log:
Fix trigger of the read event (so registerForEvent is actually useful).

Modified:
    tomcat/trunk/java/org/apache/coyote/http11/Http11Nio2Processor.java
    tomcat/trunk/java/org/apache/coyote/http11/InternalNio2InputBuffer.java
    tomcat/trunk/java/org/apache/coyote/http11/InternalNio2OutputBuffer.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11Nio2Processor.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11Nio2Processor.java?rev=1584904&r1=1584903&r2=1584904&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11Nio2Processor.java 
(original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11Nio2Processor.java Fri Apr 
 4 20:48:55 2014
@@ -144,8 +144,12 @@ public class Http11Nio2Processor extends
 
     @Override
     protected void registerForEvent(boolean read, boolean write) {
-        // Nothing to do here, the appropriate operations should
-        // already be pending
+        if (read) {
+            ((InternalNio2InputBuffer) inputBuffer).registerReadInterest();
+        }
+        if (write) {
+            ((InternalNio2OutputBuffer) outputBuffer).registerWriteInterest();
+        }
     }
 
 

Modified: 
tomcat/trunk/java/org/apache/coyote/http11/InternalNio2InputBuffer.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/InternalNio2InputBuffer.java?rev=1584904&r1=1584903&r2=1584904&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/InternalNio2InputBuffer.java 
(original)
+++ tomcat/trunk/java/org/apache/coyote/http11/InternalNio2InputBuffer.java Fri 
Apr  4 20:48:55 2014
@@ -153,6 +153,11 @@ public class InternalNio2InputBuffer ext
     private int socketReadBufferSize;
 
     /**
+     * Track write interest
+     */
+    protected volatile boolean interest = false;
+
+    /**
      * The completion handler used for asynchronous read operations
      */
     private CompletionHandler<Integer, SocketWrapper<Nio2Channel>> 
completionHandler;
@@ -202,6 +207,7 @@ public class InternalNio2InputBuffer ext
         headerData.recycle();
         readPending = false;
         flipped = false;
+        interest = false;
         e = null;
     }
 
@@ -222,6 +228,7 @@ public class InternalNio2InputBuffer ext
         parsingRequestLineStart = 0;
         parsingRequestLineQPos = -1;
         headerData.recycle();
+        interest = false;
     }
 
     /**
@@ -757,7 +764,8 @@ public class InternalNio2InputBuffer ext
                         failed(new 
EOFException(sm.getString("iib.eof.error")), attachment);
                     } else {
                         readPending = false;
-                        if (!Nio2Endpoint.isInline()) {
+                        if ((request.getReadListener() == null || interest) && 
!Nio2Endpoint.isInline()) {
+                            interest = false;
                             notify = true;
                         }
                     }
@@ -892,6 +900,18 @@ public class InternalNio2InputBuffer ext
     }
 
 
+    public void registerReadInterest() {
+        synchronized (completionHandler) {
+            if (readPending) {
+                interest = true;
+            } else {
+                // If no write is pending, notify
+                endpoint.processSocket(socket, SocketStatus.OPEN_READ, true);
+            }
+        }
+    }
+
+
     // ------------------------------------- InputStreamInputBuffer Inner Class
 
 

Modified: 
tomcat/trunk/java/org/apache/coyote/http11/InternalNio2OutputBuffer.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/InternalNio2OutputBuffer.java?rev=1584904&r1=1584903&r2=1584904&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/InternalNio2OutputBuffer.java 
(original)
+++ tomcat/trunk/java/org/apache/coyote/http11/InternalNio2OutputBuffer.java 
Fri Apr  4 20:48:55 2014
@@ -474,7 +474,7 @@ public class InternalNio2OutputBuffer ex
 
 
     @Override
-    protected void registerWriteInterest() throws IOException {
+    public void registerWriteInterest() {
         synchronized (completionHandler) {
             if (writePending.availablePermits() == 0) {
                 interest = true;

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1584904&r1=1584903&r2=1584904&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Fri Apr  4 20:48:55 2014
@@ -86,6 +86,9 @@
       <fix>
         Code cleanups and i18n in NIO2. (remm)
       </fix>
+      <fix>
+        Fix extra onDataAvailable calls. (remm)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Cluster">



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

Reply via email to