summaryrefslogtreecommitdiffstats
path: root/modules/http
diff options
context:
space:
mode:
authorJoe Orton <jorton@apache.org>2018-06-06 13:39:33 +0200
committerJoe Orton <jorton@apache.org>2018-06-06 13:39:33 +0200
commit07ab2af39d3a670e92f5e1e59749b8ecd51f9e48 (patch)
treea050b2ba937d39c4f7f54847f1d42be38f1052a2 /modules/http
parent* Makefile.in: Pass TESTS=... to run only specific tests with make check. (diff)
downloadapache2-07ab2af39d3a670e92f5e1e59749b8ecd51f9e48.tar.xz
apache2-07ab2af39d3a670e92f5e1e59749b8ecd51f9e48.zip
* modules/http/http_request.c (ap_process_request_after_handler,
ap_process_request): Cache and retrieve the brigade structure used to send EOR and FLUSH between requests in c->pool userdata, to avoid allocating a brigade structure per-request out of c->pool. Submitted by: rpluem, jorton git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1833014 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'modules/http')
-rw-r--r--modules/http/http_request.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/modules/http/http_request.c b/modules/http/http_request.c
index bb28d9c8dd..20a75d4f08 100644
--- a/modules/http/http_request.c
+++ b/modules/http/http_request.c
@@ -345,6 +345,16 @@ AP_DECLARE(apr_status_t) ap_check_pipeline(conn_rec *c, apr_bucket_brigade *bb,
return rv;
}
+#define RETRIEVE_BRIGADE_FROM_POOL(bb, key, pool, allocator) do { \
+ apr_pool_userdata_get((void **)&bb, key, pool); \
+ if (bb == NULL) { \
+ bb = apr_brigade_create(pool, allocator); \
+ apr_pool_userdata_setn((const void *)bb, key, NULL, pool); \
+ } \
+ else { \
+ apr_brigade_cleanup(bb); \
+ } \
+} while(0)
AP_DECLARE(void) ap_process_request_after_handler(request_rec *r)
{
@@ -358,7 +368,8 @@ AP_DECLARE(void) ap_process_request_after_handler(request_rec *r)
* this bucket is destroyed, the request will be logged and
* its pool will be freed
*/
- bb = apr_brigade_create(c->pool, c->bucket_alloc);
+ RETRIEVE_BRIGADE_FROM_POOL(bb, "ap_process_request_after_handler_brigade",
+ c->pool, c->bucket_alloc);
b = ap_bucket_eor_create(c->bucket_alloc, r);
APR_BRIGADE_INSERT_HEAD(bb, b);
@@ -402,7 +413,7 @@ AP_DECLARE(void) ap_process_request_after_handler(request_rec *r)
*/
rv = ap_check_pipeline(c, bb, DEFAULT_LIMIT_BLANK_LINES);
c->data_in_input_filters = (rv == APR_SUCCESS);
- apr_brigade_destroy(bb);
+ apr_brigade_cleanup(bb);
if (c->cs)
c->cs->state = (c->aborted) ? CONN_STATE_LINGER
@@ -496,7 +507,8 @@ AP_DECLARE(void) ap_process_request(request_rec *r)
ap_process_async_request(r);
if (!c->data_in_input_filters || ap_run_input_pending(c) != OK) {
- bb = apr_brigade_create(c->pool, c->bucket_alloc);
+ RETRIEVE_BRIGADE_FROM_POOL(bb, "ap_process_request_brigade",
+ c->pool, c->bucket_alloc);
b = apr_bucket_flush_create(c->bucket_alloc);
APR_BRIGADE_INSERT_HEAD(bb, b);
rv = ap_pass_brigade(c->output_filters, bb);
@@ -509,6 +521,7 @@ AP_DECLARE(void) ap_process_request(request_rec *r)
ap_log_cerror(APLOG_MARK, APLOG_INFO, rv, c, APLOGNO(01581)
"flushing data to the client");
}
+ apr_brigade_cleanup(bb);
}
if (ap_extended_status) {
ap_time_process_request(c->sbh, STOP_PREQUEST);