You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2017/12/18 14:13:24 UTC

svn commit: r1818575 - /tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java

Author: remm
Date: Mon Dec 18 14:13:24 2017
New Revision: 1818575

URL: http://svn.apache.org/viewvc?rev=1818575&view=rev
Log:
Add code to read from the internal buffer first, the upgrade transition has leftover bytes and is not manageable otherwise.

Modified:
    tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java?rev=1818575&r1=1818574&r2=1818575&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java Mon Dec 18 14:13:24 2017
@@ -1032,7 +1032,23 @@ public class Nio2Endpoint extends Abstra
             OperationState<A> state = new OperationState<>(dsts, offset, length, block, timeout, unit, attachment, check, handler);
             ScatterReadCompletionHandler<A> completion = new ScatterReadCompletionHandler<>();
             Nio2Endpoint.startInline();
-            getSocket().read(dsts, offset, length, timeout, unit, state, completion);
+            long nBytes = 0;
+            if (!socketBufferHandler.isReadBufferEmpty()) {
+                // There is still data inside the main read buffer, use it to fill out the destination buffers
+                synchronized (readCompletionHandler) {
+                    // Note: It is not necessary to put this code in the completion handler
+                    socketBufferHandler.configureReadBufferForRead();
+                    for (int i = 0; i < length && !socketBufferHandler.isReadBufferEmpty(); i++) {
+                        nBytes += transfer(socketBufferHandler.getReadBuffer(), dsts[offset + i]);
+                    }
+                }
+                if (nBytes > 0) {
+                    completion.completed(Long.valueOf(nBytes), state);
+                }
+            }
+            if (nBytes == 0) {
+                getSocket().read(dsts, offset, length, timeout, unit, state, completion);
+            }
             Nio2Endpoint.endInline();
             if (block == BlockingMode.BLOCK) {
                 synchronized (state) {
@@ -1087,6 +1103,7 @@ public class Nio2Endpoint extends Abstra
             OperationState<A> state = new OperationState<>(srcs, offset, length, block, timeout, unit, attachment, check, handler);
             GatherWriteCompletionHandler<A> completion = new GatherWriteCompletionHandler<>();
             Nio2Endpoint.startInline();
+            // It should be less necessary to check the buffer state as it is easy to flush before
             getSocket().write(srcs, offset, length, timeout, unit, state, completion);
             Nio2Endpoint.endInline();
             if (block == BlockingMode.BLOCK) {



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