summaryrefslogtreecommitdiff
path: root/file_io
diff options
context:
space:
mode:
authordavi <davi@13f79535-47bb-0310-9956-ffa450edef68>2007-07-06 01:01:18 +0000
committerdavi <davi@13f79535-47bb-0310-9956-ffa450edef68>2007-07-06 01:01:18 +0000
commit4054b9581dfb57db9b249b08da619de0df829123 (patch)
treee85269001cc60f4f7b51671b3babef55f1f28d2e /file_io
parent2e2b0adf2d49acdee49c29d56b41c73a2893bc3b (diff)
downloadlibapr-4054b9581dfb57db9b249b08da619de0df829123.tar.gz
Rework apr_file_writev_full so it tries to writev() data before resorting to
a plain write. git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@553682 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'file_io')
-rw-r--r--file_io/unix/fullrw.c32
1 files changed, 29 insertions, 3 deletions
diff --git a/file_io/unix/fullrw.c b/file_io/unix/fullrw.c
index 9ad27ec99..59173b4a6 100644
--- a/file_io/unix/fullrw.c
+++ b/file_io/unix/fullrw.c
@@ -72,10 +72,36 @@ APR_DECLARE(apr_status_t) apr_file_writev_full(apr_file_t *thefile,
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)