[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