diff options
author | Stefan Fritsch <sf@apache.org> | 2012-10-27 22:38:33 +0000 |
---|---|---|
committer | Stefan Fritsch <sf@apache.org> | 2012-10-27 22:38:33 +0000 |
commit | aa8ba3d9d5dea490d376494b4f50b0e7c8480d11 (patch) | |
tree | 23a6eb5cfb86eb65ba9cf563e155c2fbac81acbc /buckets | |
parent | 6af644673a9ff6f5c2583b0499dc455698185682 (diff) | |
download | apr-aa8ba3d9d5dea490d376494b4f50b0e7c8480d11.tar.gz |
Make apr_brigade_(v)putstrs more efficient by using apr_brigade_writev
instead of apr_brigade_write
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1402903 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'buckets')
-rw-r--r-- | buckets/apr_brigade.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/buckets/apr_brigade.c b/buckets/apr_brigade.c index b22e98220..42403f4a1 100644 --- a/buckets/apr_brigade.c +++ b/buckets/apr_brigade.c @@ -417,17 +417,30 @@ APR_DECLARE(apr_status_t) apr_brigade_vputstrs(apr_bucket_brigade *b, void *ctx, va_list va) { +#define MAX_VECS 8 + struct iovec vec[MAX_VECS]; + apr_size_t i = 0; + for (;;) { - const char *str = va_arg(va, const char *); + char *str = va_arg(va, char *); apr_status_t rv; if (str == NULL) break; - rv = apr_brigade_write(b, flush, ctx, str, strlen(str)); - if (rv != APR_SUCCESS) - return rv; + vec[i].iov_base = str; + vec[i].iov_len = strlen(str); + i++; + + if (i == MAX_VECS) { + rv = apr_brigade_writev(b, flush, ctx, vec, i); + if (rv != APR_SUCCESS) + return rv; + i = 0; + } } + if (i != 0) + return apr_brigade_writev(b, flush, ctx, vec, i); return APR_SUCCESS; } |