diff options
author | davi <davi@13f79535-47bb-0310-9956-ffa450edef68> | 2007-07-06 01:01:18 +0000 |
---|---|---|
committer | davi <davi@13f79535-47bb-0310-9956-ffa450edef68> | 2007-07-06 01:01:18 +0000 |
commit | 4054b9581dfb57db9b249b08da619de0df829123 (patch) | |
tree | e85269001cc60f4f7b51671b3babef55f1f28d2e /file_io | |
parent | 2e2b0adf2d49acdee49c29d56b41c73a2893bc3b (diff) | |
download | libapr-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.c | 32 |
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) |