summaryrefslogtreecommitdiff
path: root/buckets
diff options
context:
space:
mode:
authorStefan Fritsch <sf@apache.org>2012-10-27 22:38:33 +0000
committerStefan Fritsch <sf@apache.org>2012-10-27 22:38:33 +0000
commitaa8ba3d9d5dea490d376494b4f50b0e7c8480d11 (patch)
tree23a6eb5cfb86eb65ba9cf563e155c2fbac81acbc /buckets
parent6af644673a9ff6f5c2583b0499dc455698185682 (diff)
downloadapr-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.c21
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;
}