You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by da...@apache.org on 2007/07/06 03:01:19 UTC

svn commit: r553682 - /apr/apr/trunk/file_io/unix/fullrw.c

Author: davi
Date: Thu Jul  5 18:01:18 2007
New Revision: 553682

URL: http://svn.apache.org/viewvc?view=rev&rev=553682
Log:
Rework apr_file_writev_full so it tries to writev() data before resorting to
a plain write.

Modified:
    apr/apr/trunk/file_io/unix/fullrw.c

Modified: apr/apr/trunk/file_io/unix/fullrw.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/file_io/unix/fullrw.c?view=diff&rev=553682&r1=553681&r2=553682
==============================================================================
--- apr/apr/trunk/file_io/unix/fullrw.c (original)
+++ apr/apr/trunk/file_io/unix/fullrw.c Thu Jul  5 18:01:18 2007
@@ -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)