summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYann Ylavic <ylavic@apache.org>2015-10-06 22:23:24 +0000
committerYann Ylavic <ylavic@apache.org>2015-10-06 22:23:24 +0000
commitf296d2b85b51618ee76b4dfa96673887c4ab909f (patch)
treeae265ae4e1b104f51d86c6e91b1eb00db4bad375
parent91b4321bfac34c6a089af37d7b31e6699679622a (diff)
downloadhttpd-f296d2b85b51618ee76b4dfa96673887c4ab909f.tar.gz
eor_bucket: follow up to r1707084: use an inner shared bucket.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1707159 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--server/eor_bucket.c49
1 files changed, 23 insertions, 26 deletions
diff --git a/server/eor_bucket.c b/server/eor_bucket.c
index 2726d6bdec..bce4b441ed 100644
--- a/server/eor_bucket.c
+++ b/server/eor_bucket.c
@@ -21,15 +21,15 @@
static apr_status_t eor_bucket_cleanup(void *data)
{
- apr_bucket *b = (apr_bucket *)data;
- request_rec *r = (request_rec *)b->data;
+ request_rec **rp = data;
- if (r != NULL) {
+ if (*rp) {
+ request_rec *r = *rp;
/*
* If eor_bucket_destroy is called after us, this prevents
* eor_bucket_destroy from trying to destroy the pool again.
*/
- b->data = NULL;
+ *rp = NULL;
/* Update child status and log the transaction */
ap_update_child_status(r->connection->sbh, SERVER_BUSY_LOG, r);
ap_run_log_transaction(r);
@@ -50,11 +50,13 @@ static apr_status_t eor_bucket_read(apr_bucket *b, const char **str,
AP_DECLARE(apr_bucket *) ap_bucket_eor_make(apr_bucket *b, request_rec *r)
{
- b->length = 0;
- b->start = 0;
- b->data = r;
- b->type = &ap_bucket_type_eor;
+ apr_bucket *h;
+ h = apr_bucket_alloc(sizeof(*h), b->list);
+ h->data = r;
+
+ b = apr_bucket_shared_make(b, h, 0, 0);
+ b->type = &ap_bucket_type_eor;
return b;
}
@@ -66,7 +68,9 @@ AP_DECLARE(apr_bucket *) ap_bucket_eor_create(apr_bucket_alloc_t *list,
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
+ b = ap_bucket_eor_make(b, r);
if (r) {
+ apr_bucket *h = b->data;
/*
* Register a cleanup for the request pool as the eor bucket could
* have been allocated from a different pool then the request pool
@@ -76,38 +80,31 @@ AP_DECLARE(apr_bucket *) ap_bucket_eor_create(apr_bucket_alloc_t *list,
* We need to use a pre-cleanup here because a module may create a
* sub-pool which is still needed during the log_transaction hook.
*/
- apr_pool_pre_cleanup_register(r->pool, (void *)b, eor_bucket_cleanup);
+ apr_pool_pre_cleanup_register(r->pool, &h->data, eor_bucket_cleanup);
}
- return ap_bucket_eor_make(b, r);
+ return b;
}
static void eor_bucket_destroy(void *data)
{
- request_rec *r = (request_rec *)data;
+ apr_bucket *h = data;
- if (r) {
- /* eor_bucket_cleanup will be called when the pool gets destroyed */
- apr_pool_destroy(r->pool);
+ if (apr_bucket_shared_destroy(h)) {
+ request_rec *r = h->data;
+ if (r) {
+ /* eor_bucket_cleanup will be called when the pool gets destroyed */
+ apr_pool_destroy(r->pool);
+ }
+ apr_bucket_free(h);
}
}
-static apr_status_t eor_bucket_copy(apr_bucket *a, apr_bucket **b)
-{
- *b = apr_bucket_alloc(sizeof(**b), a->list); /* XXX: check for failure? */
- **b = *a;
-
- /* We don't want the request to be destroyed more than once. */
- (*b)->data = NULL;
-
- return APR_SUCCESS;
-}
-
AP_DECLARE_DATA const apr_bucket_type_t ap_bucket_type_eor = {
"EOR", 5, APR_BUCKET_METADATA,
eor_bucket_destroy,
eor_bucket_read,
apr_bucket_setaside_noop,
apr_bucket_split_notimpl,
- eor_bucket_copy
+ apr_bucket_shared_copy
};