You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by vi...@apache.org on 2016/08/27 09:01:45 UTC

svn commit: r1757976 - /tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java

Author: violetagg
Date: Sat Aug 27 09:01:45 2016
New Revision: 1757976

URL: http://svn.apache.org/viewvc?rev=1757976&view=rev
Log:
When flushing if possible write the data to the socket directly from the provided buffer instead of copying data first to the socket write buffer and then to the socket.

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

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java?rev=1757976&r1=1757975&r2=1757976&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java Sat Aug 27 09:01:45 2016
@@ -427,19 +427,19 @@ public abstract class SocketWrapperBase<
         // If it is possible write the data to the socket directly from the
         // provided buffer otherwise transfer it to the socket write buffer
         if (socketBufferHandler.isWriteBufferEmpty()) {
-            writeBlockingInternal(from);
+            writeByteBufferBlocking(from);
         } else {
             socketBufferHandler.configureWriteBufferForWrite();
             transfer(from, socketBufferHandler.getWriteBuffer());
             if (!socketBufferHandler.isWriteBufferWritable()) {
                 doWrite(true);
-                writeBlockingInternal(from);
+                writeByteBufferBlocking(from);
             }
         }
     }
 
 
-    private void writeBlockingInternal(ByteBuffer from) throws IOException {
+    private void writeByteBufferBlocking(ByteBuffer from) throws IOException {
         // The socket write buffer capacity is socket.appWriteBufSize
         int limit = socketBufferHandler.getWriteBuffer().capacity();
         int fromLimit = from.limit();
@@ -509,18 +509,7 @@ public abstract class SocketWrapperBase<
      */
     protected void writeNonBlocking(ByteBuffer from) throws IOException {
         if (bufferedWrites.size() == 0 && socketBufferHandler.isWriteBufferWritable()) {
-            if (socketBufferHandler.isWriteBufferEmpty()) {
-                writeNonBlockingInternal(from);
-            } else {
-                socketBufferHandler.configureWriteBufferForWrite();
-                transfer(from, socketBufferHandler.getWriteBuffer());
-                if (!socketBufferHandler.isWriteBufferWritable()) {
-                    doWrite(false);
-                    if (socketBufferHandler.isWriteBufferWritable()) {
-                        writeNonBlockingInternal(from);
-                    }
-                }
-            }
+            writeNonBlockingInternal(from);
         }
 
         if (from.remaining() > 0) {
@@ -531,6 +520,24 @@ public abstract class SocketWrapperBase<
 
 
     private boolean writeNonBlockingInternal(ByteBuffer from) throws IOException {
+        if (socketBufferHandler.isWriteBufferEmpty()) {
+            return writeByteBufferNonBlocking(from);
+        } else {
+            socketBufferHandler.configureWriteBufferForWrite();
+            transfer(from, socketBufferHandler.getWriteBuffer());
+            if (!socketBufferHandler.isWriteBufferWritable()) {
+                doWrite(false);
+                if (socketBufferHandler.isWriteBufferWritable()) {
+                    return writeByteBufferNonBlocking(from);
+                }
+            }
+        }
+
+        return !socketBufferHandler.isWriteBufferWritable();
+    }
+
+
+    private boolean writeByteBufferNonBlocking(ByteBuffer from) throws IOException {
         // The socket write buffer capacity is socket.appWriteBufSize
         int limit = socketBufferHandler.getWriteBuffer().capacity();
         int fromLimit = from.limit();
@@ -543,7 +550,7 @@ public abstract class SocketWrapperBase<
                 // Didn't write the whole amount of data in the last
                 // non-blocking write.
                 // Exit the loop.
-                return false;
+                return true;
             }
         }
 
@@ -552,7 +559,7 @@ public abstract class SocketWrapperBase<
             transfer(from, socketBufferHandler.getWriteBuffer());
         }
 
-        return socketBufferHandler.isWriteBufferWritable();
+        return false;
     }
 
 
@@ -586,19 +593,18 @@ public abstract class SocketWrapperBase<
 
         if (bufferedWrites.size() > 0) {
             Iterator<ByteBufferHolder> bufIter = bufferedWrites.iterator();
-            while (socketBufferHandler.isWriteBufferEmpty() && bufIter.hasNext()) {
+            while (bufIter.hasNext()) {
                 ByteBufferHolder buffer = bufIter.next();
                 buffer.flip();
-                while (socketBufferHandler.isWriteBufferEmpty()
-                        && buffer.getBuf().remaining() > 0) {
-                    socketBufferHandler.configureWriteBufferForWrite();
-                    transfer(buffer.getBuf(), socketBufferHandler.getWriteBuffer());
-                    if (buffer.getBuf().remaining() == 0) {
-                        bufIter.remove();
-                    }
-                    doWrite(true);
+                writeBlocking(buffer.getBuf());
+                if (buffer.getBuf().remaining() == 0) {
+                    bufIter.remove();
                 }
             }
+
+            if (!socketBufferHandler.isWriteBufferEmpty()) {
+                doWrite(true);
+            }
         }
 
     }
@@ -610,28 +616,27 @@ public abstract class SocketWrapperBase<
         // Write to the socket, if there is anything to write
         if (dataLeft) {
             doWrite(false);
+            dataLeft = !socketBufferHandler.isWriteBufferEmpty();
         }
 
-        dataLeft = !socketBufferHandler.isWriteBufferEmpty();
-
         if (!dataLeft && bufferedWrites.size() > 0) {
             Iterator<ByteBufferHolder> bufIter = bufferedWrites.iterator();
-            while (socketBufferHandler.isWriteBufferEmpty() && bufIter.hasNext()) {
+            while (!dataLeft && bufIter.hasNext()) {
                 ByteBufferHolder buffer = bufIter.next();
                 buffer.flip();
-                while (socketBufferHandler.isWriteBufferEmpty()
-                        && buffer.getBuf().remaining() > 0) {
-                    socketBufferHandler.configureWriteBufferForWrite();
-                    transfer(buffer.getBuf(), socketBufferHandler.getWriteBuffer());
-                    if (buffer.getBuf().remaining() == 0) {
-                        bufIter.remove();
-                    }
-                    doWrite(false);
+                dataLeft = writeNonBlockingInternal(buffer.getBuf());
+                if (buffer.getBuf().remaining() == 0) {
+                    bufIter.remove();
                 }
             }
+
+            if (!dataLeft && !socketBufferHandler.isWriteBufferEmpty()) {
+                doWrite(false);
+                dataLeft = !socketBufferHandler.isWriteBufferEmpty();
+            }
         }
 
-        return !socketBufferHandler.isWriteBufferEmpty();
+        return dataLeft;
     }
 
 



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