[prev in list] [next in list] [prev in thread] [next in thread] 

List:       apr-dev
Subject:    [patch 6/9] writev_full fallback
From:       Davi Arnaut <davi () haxent ! com ! br>
Date:       2007-04-27 14:29:24
Message-ID: 20070427143647.786882000 () haxent ! com ! br
[Download RAW message or body]

Rework apr_file_writev_full so it tries to writev() data before resorting to
a plain write.

---
 srclib/apr/file_io/unix/fullrw.c |   32 +++++++++++++++++++++++++++++---
 1 file changed, 29 insertions(+), 3 deletions(-)

Index: 2.2.x/srclib/apr/file_io/unix/fullrw.c
===================================================================
--- 2.2.x.orig/srclib/apr/file_io/unix/fullrw.c	2007-04-27 11:09:48.000000000 -0300
+++ 2.2.x/srclib/apr/file_io/unix/fullrw.c	2007-04-27 11:09:51.000000000 -0300
@@ -72,10 +72,36 @@
     apr_size_t amt = 0;
     apr_size_t total = 0;
 
-    for (i = 0; i < nvec && rv == APR_SUCCESS; i++) {
-        rv = apr_file_write_full(thefile, vec[i].iov_base, 
+    for (i = 0; i < nvec; i++) {
+        total += vec[i].iov_len;
+    }
+
+    rv = apr_file_writev(thefile, vec, nvec, &amt);
+
+    if (bytes_written != NULL)
+        *bytes_written = amt;
+
+    if (rv != APR_SUCCESS || (amt == total)) {
+        return rv;
+    }
+
+    for (i = 0; i < nvec && amt; i++) {
+        if (amt >= vec[i].iov_len) {
+            amt -= vec[i].iov_len;
+        }
+        else {
+            break;
+        }
+    }
+
+    if (amt) {
+        rv = apr_file_write_full(thefile, vec[i].iov_base + amt,
+                                 vec[i].iov_len - amt, NULL);
+    }
+
+    for (; i < nvec && rv == APR_SUCCESS; i++) {
+        rv = apr_file_write_full(thefile, vec[i].iov_base,
                                  vec[i].iov_len, &amt);
-        total += amt;
     }
 
     if (bytes_written != NULL)

--
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic