Author: violetagg
Date: Wed Aug 31 10:49:10 2016
New Revision: 1758580

URL: http://svn.apache.org/viewvc?rev=1758580&view=rev
Log:
When AprEndpoint.write(boolean, ByteBuffer) is invoked with a non direct 
ByteBuffer then copy that ByteBuffer to the socket write buffer before 
transferring the data to the socket.

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

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=1758580&r1=1758579&r2=1758580&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Wed Aug 31 
10:49:10 2016
@@ -2479,6 +2479,59 @@ public class AprEndpoint extends Abstrac
 
 
         @Override
+        protected void writeByteBufferBlocking(ByteBuffer from) throws 
IOException {
+            if (from.isDirect()) {
+                super.writeByteBufferBlocking(from);
+            } else {
+                // The socket write buffer capacity is socket.appWriteBufSize
+                ByteBuffer writeBuffer = socketBufferHandler.getWriteBuffer();
+                int limit = writeBuffer.capacity();
+                while (from.remaining() >= limit) {
+                    socketBufferHandler.configureWriteBufferForWrite();
+                    transfer(from, writeBuffer);
+                    doWrite(true);
+                }
+
+                if (from.remaining() > 0) {
+                    socketBufferHandler.configureWriteBufferForWrite();
+                    transfer(from, writeBuffer);
+                }
+            }
+        }
+
+
+        @Override
+        protected boolean writeByteBufferNonBlocking(ByteBuffer from) throws 
IOException {
+            if (from.isDirect()) {
+                return super.writeByteBufferNonBlocking(from);
+            } else {
+                // The socket write buffer capacity is socket.appWriteBufSize
+                ByteBuffer writeBuffer = socketBufferHandler.getWriteBuffer();
+                int limit = writeBuffer.capacity();
+                while (from.remaining() >= limit) {
+                    socketBufferHandler.configureWriteBufferForWrite();
+                    transfer(from, writeBuffer);
+                    int newPosition = writeBuffer.position() + limit;
+                    doWrite(false);
+                    if (writeBuffer.position() != newPosition) {
+                        // Didn't write the whole amount of data in the last
+                        // non-blocking write.
+                        // Exit the loop.
+                        return true;
+                    }
+                }
+
+                if (from.remaining() > 0) {
+                    socketBufferHandler.configureWriteBufferForWrite();
+                    transfer(from, writeBuffer);
+                }
+
+                return false;
+            }
+        }
+
+
+        @Override
         protected void doWrite(boolean block, ByteBuffer from) throws 
IOException {
             if (closed) {
                 throw new IOException(sm.getString("socket.apr.closed", 
getSocket()));

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=1758580&r1=1758579&r2=1758580&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java Wed Aug 
31 10:49:10 2016
@@ -453,7 +453,7 @@ public abstract class SocketWrapperBase<
     }
 
 
-    private void writeByteBufferBlocking(ByteBuffer from) throws IOException {
+    protected void writeByteBufferBlocking(ByteBuffer from) throws IOException 
{
         // The socket write buffer capacity is socket.appWriteBufSize
         int limit = socketBufferHandler.getWriteBuffer().capacity();
         int fromLimit = from.limit();
@@ -551,7 +551,7 @@ public abstract class SocketWrapperBase<
     }
 
 
-    private boolean writeByteBufferNonBlocking(ByteBuffer from) throws 
IOException {
+    protected boolean writeByteBufferNonBlocking(ByteBuffer from) throws 
IOException {
         // The socket write buffer capacity is socket.appWriteBufSize
         int limit = socketBufferHandler.getWriteBuffer().capacity();
         int fromLimit = from.limit();



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

Reply via email to