]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
* server/core_filters.c (send_brigade_nonblocking): Use a non-blocking
authorJoe Orton <jorton@apache.org>
Mon, 23 Jan 2012 16:57:07 +0000 (16:57 +0000)
committerJoe Orton <jorton@apache.org>
Mon, 23 Jan 2012 16:57:07 +0000 (16:57 +0000)
  bucket read, allowing any pending data to be flushed before trying a
  (potentially slow) blocking read.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1234899 13f79535-47bb-0310-9956-ffa450edef68

server/core_filters.c

index b9c4d9ffea0eb9bf1039ae107f60343c904bb26c..42da5c279f41fafc026024890cd7d278c48d74d5 100644 (file)
@@ -656,10 +656,26 @@ static apr_status_t send_brigade_nonblocking(apr_socket_t *s,
         if (!APR_BUCKET_IS_METADATA(bucket)) {
             const char *data;
             apr_size_t length;
-            rv = apr_bucket_read(bucket, &data, &length, APR_BLOCK_READ);
+            
+            /* Non-blocking read first, in case this is a morphing
+             * bucket type. */
+            rv = apr_bucket_read(bucket, &data, &length, APR_NONBLOCK_READ);
+            if (APR_STATUS_IS_EAGAIN(rv)) {
+                /* Read would block; flush any pending data and retry. */
+                if (nvec) {
+                    rv = writev_nonblocking(s, vec, nvec, bb, bytes_written, c);
+                    if (rv) {
+                        return rv;
+                    }
+                    nvec = 0;
+                }
+                
+                rv = apr_bucket_read(bucket, &data, &length, APR_BLOCK_READ);
+            }
             if (rv != APR_SUCCESS) {
                 return rv;
             }
+
             /* reading may have split the bucket, so recompute next: */
             next = APR_BUCKET_NEXT(bucket);
             vec[nvec].iov_base = (char *)data;