Author: markt
Date: Wed Mar 13 20:59:17 2013
New Revision: 1456125

URL: http://svn.apache.org/r1456125
Log:
Check this in before I start to work on the APR/native SSL issue

Modified:
    
tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprServletOutputStream.java

Modified: 
tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprServletOutputStream.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprServletOutputStream.java?rev=1456125&r1=1456124&r2=1456125&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprServletOutputStream.java 
(original)
+++ 
tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprServletOutputStream.java 
Wed Mar 13 20:59:17 2013
@@ -47,62 +47,75 @@ public class AprServletOutputStream exte
         Lock readLock = wrapper.getBlockingStatusReadLock();
         WriteLock writeLock = wrapper.getBlockingStatusWriteLock();
 
-        boolean writeDone = false;
-        int result = 0;
         try {
             readLock.lock();
             if (wrapper.getBlockingStatus() == block) {
                 if (closed) {
                     throw new IOException(sm.getString("apr.closed"));
                 }
-                result = Socket.send(socket, b, off, len);
-                writeDone = true;
+                return doWriteInternal(b, off, len);
             }
         } finally {
             readLock.unlock();
         }
 
-        if (!writeDone) {
+        try {
+            writeLock.lock();
+            // Set the current settings for this socket
+            wrapper.setBlockingStatus(block);
+            if (block) {
+                Socket.timeoutSet(socket, endpoint.getSoTimeout() * 1000);
+            } else {
+                Socket.timeoutSet(socket, 0);
+            }
+
+            // Downgrade the lock
             try {
-                writeLock.lock();
-                wrapper.setBlockingStatus(block);
-                // Set the current settings for this socket
-                Socket.optSet(socket, Socket.APR_SO_NONBLOCK, (block ? -1 : 
0));
-                // Downgrade the lock
-                try {
-                    readLock.lock();
-                    writeLock.unlock();
-                    if (closed) {
-                        throw new IOException(sm.getString("apr.closed"));
-                    }
-                    result = Socket.send(socket, b, off, len);
-                } finally {
-                    readLock.unlock();
+                readLock.lock();
+                writeLock.unlock();
+                if (closed) {
+                    throw new IOException(sm.getString("apr.closed"));
                 }
+                return doWriteInternal(b, off, len);
             } finally {
-                // Should have been released above but may not have been on 
some
-                // exception paths
-                if (writeLock.isHeldByCurrentThread()) {
-                    writeLock.unlock();
-                }
+                readLock.unlock();
+            }
+        } finally {
+            // Should have been released above but may not have been on some
+            // exception paths
+            if (writeLock.isHeldByCurrentThread()) {
+                writeLock.unlock();
             }
         }
+    }
+
 
-        if (result >= 0) {
-            if (result < len) {
+    private int doWriteInternal(byte[] b, int off, int len) throws IOException 
{
+
+        int start = off;
+        int left = len;
+        int written;
+
+        do {
+            written = Socket.send(socket, b, start, left);
+            if (Status.APR_STATUS_IS_EAGAIN(-written)) {
                 endpoint.getPoller().add(socket, -1, false, true);
+                written = 0;
+            } else if (written < 0) {
+                throw new IOException(sm.getString("apr.write.error",
+                        Integer.valueOf(-written)));
             }
-            return result;
-        } else if (-result == Status.EAGAIN) {
+            start += written;
+            left -= written;
+        } while (written > 0 && left > 0);
+
+        if (left > 0) {
             endpoint.getPoller().add(socket, -1, false, true);
-            return 0;
         }
-
-        throw new IOException(sm.getString("apr.write.error",
-                Integer.valueOf(-result)));
-
+        return len - left;
     }
 
+
     @Override
     protected void doFlush() throws IOException {
         // TODO Auto-generated method stub



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

Reply via email to