diff options
author | Joe Orton <jorton@apache.org> | 2018-06-06 13:39:33 +0200 |
---|---|---|
committer | Joe Orton <jorton@apache.org> | 2018-06-06 13:39:33 +0200 |
commit | 07ab2af39d3a670e92f5e1e59749b8ecd51f9e48 (patch) | |
tree | a050b2ba937d39c4f7f54847f1d42be38f1052a2 /modules/http | |
parent | * Makefile.in: Pass TESTS=... to run only specific tests with make check. (diff) | |
download | apache2-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.c | 19 |
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); |