From: Cliff Woolley Date: Fri, 29 Mar 2002 08:17:26 +0000 (+0000) Subject: BUCKET FREELISTS X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d6e02ee344664f94dfc84e9cf770d86c18b53cb2;p=apache BUCKET FREELISTS Add an allocator-passing mechanism throughout the bucket brigades API. From Apache's standpoint, the apr_bucket_alloc_t* used throughout a given connection is stored in the conn_rec by the create_connection hook. That means it's the MPM's job to optimize recycling of apr_bucket_alloc_t's -- the MPM must ensure that no two threads can ever use the same one at the same time, for instance. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@94304 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 92cb0e2e62..fbcf30c462 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,10 @@ Changes with Apache 2.0.35 + *) Change bucket brigades API to allow a "bucket allocator" to be + passed in at certain points. This allows us to implement freelists + so that we can stop using malloc/free so frequently. + [Cliff Woolley, Brian Pane] + *) Add support for macro expansion within the variable names in and directives [Brian Pane] diff --git a/STATUS b/STATUS index 2aecee2a51..a07e606632 100644 --- a/STATUS +++ b/STATUS @@ -1,5 +1,5 @@ APACHE 2.0 STATUS: -*-text-*- -Last modified at [$Date: 2002/03/26 20:35:50 $] +Last modified at [$Date: 2002/03/29 08:17:19 $] Release: @@ -49,10 +49,6 @@ CURRENT RELEASE NOTES: FINAL RELEASE SHOWSTOPPERS: - * API changes planned for 2.0 that should happen before the - GA release: - * Free lists for bucket allocation - * We do not properly substitute the prefix-variables in the configuration scripts or generated-configs. (i.e. if sysconfdir is etc, httpd-std.conf points to conf.) @@ -311,14 +307,8 @@ RELEASE NON-SHOWSTOPPERS BUT WOULD BE REAL NICE TO WRAP THESE UP: bands, double free detection, etc. would be cool but certainly not a hard requirement. - Status: Cliff started to implement this using SMS as has - been discussed at length for months, but since - SMS is not being used anywhere else in the server, - several people expressed the opinion that we should - get rid of it entirely, meaning that the buckets - need their own memory management (free list) functions. - Cliff will implement that this weekend so we at least - have something to look at/compare with. + Status: The necessary API changes are in... apr_buckets_alloc.c + just needs to be fleshed out. * Eliminate unnecessary creation of pipes in mod_cgid diff --git a/include/ap_mmn.h b/include/ap_mmn.h index b3344869e2..4af558f9fa 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -102,12 +102,13 @@ * 20020318 (2.0.34-dev) mod_dav's API for REPORT generation changed * 20020319 (2.0.34-dev) M_INVALID changed, plus new M_* methods for RFC 3253 * 20020327 (2.0.35-dev) Add parameter to quick_handler hook + * 20020329 (2.0.35-dev) bump for addition of freelists to bucket API */ #define MODULE_MAGIC_COOKIE 0x41503230UL /* "AP20" */ #ifndef MODULE_MAGIC_NUMBER_MAJOR -#define MODULE_MAGIC_NUMBER_MAJOR 20020327 +#define MODULE_MAGIC_NUMBER_MAJOR 20020329 #endif #define MODULE_MAGIC_NUMBER_MINOR 0 /* 0...n */ #define MODULE_MAGIC_NUMBER MODULE_MAGIC_NUMBER_MAJOR /* backward compat */ diff --git a/include/http_connection.h b/include/http_connection.h index a1b62f2496..85536ed65e 100644 --- a/include/http_connection.h +++ b/include/http_connection.h @@ -57,6 +57,7 @@ #include "apr_hooks.h" #include "apr_network_io.h" +#include "apr_buckets.h" #ifdef __cplusplus extern "C" { @@ -114,7 +115,8 @@ AP_DECLARE(void) ap_lingering_close(conn_rec *c); * @return An allocated connection record or NULL. */ AP_DECLARE_HOOK(conn_rec *, create_connection, - (apr_pool_t *p, server_rec *server, apr_socket_t *csd, long conn_id, void *sbh)) + (apr_pool_t *p, server_rec *server, apr_socket_t *csd, + long conn_id, void *sbh, apr_bucket_alloc_t *alloc)) /** * This hook gives protocol modules an opportunity to set everything up diff --git a/include/http_protocol.h b/include/http_protocol.h index 87f823830d..5ad071fa8f 100644 --- a/include/http_protocol.h +++ b/include/http_protocol.h @@ -666,12 +666,14 @@ AP_DECLARE(apr_bucket *) ap_bucket_error_make(apr_bucket *b, int error, * Create a bucket referring to an HTTP error. * @param error The HTTP error code to put in the bucket. * @param buf An optional error string to put in the bucket. - * @param p A pool to allocate out of. + * @param p A pool to allocate the error string out of. + * @param list The bucket allocator from which to allocate the bucket * @return The new bucket, or NULL if allocation failed - * @deffunc apr_bucket *ap_bucket_error_create(int error, const char *buf, apr_pool_t *p) + * @deffunc apr_bucket *ap_bucket_error_create(int error, const char *buf, apr_pool_t *p, apr_bucket_alloc_t *list) */ -AP_DECLARE(apr_bucket *) ap_bucket_error_create(int error, - const char *buf, apr_pool_t *p); +AP_DECLARE(apr_bucket *) ap_bucket_error_create(int error, const char *buf, + apr_pool_t *p, + apr_bucket_alloc_t *list); AP_DECLARE_NONSTD(apr_status_t) ap_byterange_filter(ap_filter_t *f, apr_bucket_brigade *b); AP_DECLARE_NONSTD(apr_status_t) ap_http_header_filter(ap_filter_t *f, apr_bucket_brigade *b); diff --git a/include/httpd.h b/include/httpd.h index 143f00f8a0..fc9abf1272 100644 --- a/include/httpd.h +++ b/include/httpd.h @@ -1008,6 +1008,8 @@ struct conn_rec { struct ap_filter_t *output_filters; /** handle to scoreboard information for this connection */ void *sbh; + /** The bucket allocator to use for all bucket/brigade creations */ + struct apr_bucket_alloc_t *bucket_alloc; }; /* Per-vhost config... */ diff --git a/modules/arch/win32/mod_isapi.c b/modules/arch/win32/mod_isapi.c index 522082a7de..c53d2d0b7e 100644 --- a/modules/arch/win32/mod_isapi.c +++ b/modules/arch/win32/mod_isapi.c @@ -646,16 +646,17 @@ BOOL WINAPI WriteClient (HCONN ConnID, LPVOID Buffer, LPDWORD lpdwBytes, DWORD dwReserved) { request_rec *r = ((isapi_cid *)ConnID)->r; + conn_rec *c = r->connection; apr_bucket_brigade *bb; apr_bucket *b; if (dwReserved == HSE_IO_SYNC) ; /* XXX: Fake it */ - bb = apr_brigade_create(r->pool); - b = apr_bucket_transient_create(Buffer, *lpdwBytes); + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_transient_create(Buffer, *lpdwBytes, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); - b = apr_bucket_flush_create(); + b = apr_bucket_flush_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); ap_pass_brigade(r->output_filters, bb); @@ -739,6 +740,7 @@ BOOL WINAPI ServerSupportFunction(HCONN hConn, DWORD dwHSERequest, { isapi_cid *cid = (isapi_cid *)hConn; request_rec *r = cid->r; + conn_rec *c = r->connection; request_rec *subreq; switch (dwHSERequest) { @@ -792,11 +794,11 @@ BOOL WINAPI ServerSupportFunction(HCONN hConn, DWORD dwHSERequest, else if ((apr_size_t)ate < headlen) { apr_bucket_brigade *bb; apr_bucket *b; - bb = apr_brigade_create(cid->r->pool); + bb = apr_brigade_create(cid->r->pool, c->bucket_alloc); b = apr_bucket_transient_create((char*) lpdwDataType + ate, - headlen - ate); + headlen - ate, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); - b = apr_bucket_flush_create(); + b = apr_bucket_flush_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); ap_pass_brigade(cid->r->output_filters, bb); } @@ -897,7 +899,7 @@ BOOL WINAPI ServerSupportFunction(HCONN hConn, DWORD dwHSERequest, } /* apr_dupfile_oshandle (&fd, tf->hFile, r->pool); */ - bb = apr_brigade_create(r->pool); + bb = apr_brigade_create(r->pool, c->bucket_alloc); if (tf->dwFlags & HSE_IO_SEND_HEADERS) { @@ -923,27 +925,29 @@ BOOL WINAPI ServerSupportFunction(HCONN hConn, DWORD dwHSERequest, if ((apr_size_t)ate < tf->HeadLength) { b = apr_bucket_transient_create((char*)tf->pHead + ate, - tf->HeadLength - ate); + tf->HeadLength - ate, + c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); } } else if (tf->pHead && tf->HeadLength) { b = apr_bucket_transient_create((char*)tf->pHead, - tf->HeadLength); + tf->HeadLength, + c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); } b = apr_bucket_file_create(fd, tf->Offset, - tf->BytesToWrite, r->pool); + tf->BytesToWrite, r->pool, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); if (tf->pTail && tf->TailLength) { b = apr_bucket_transient_create((char*)tf->pTail, - tf->TailLength); + tf->TailLength, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); } - b = apr_bucket_flush_create(); + b = apr_bucket_flush_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); ap_pass_brigade(r->output_filters, bb); @@ -1095,11 +1099,12 @@ BOOL WINAPI ServerSupportFunction(HCONN hConn, DWORD dwHSERequest, else if ((apr_size_t)ate < shi->cchHeader) { apr_bucket_brigade *bb; apr_bucket *b; - bb = apr_brigade_create(cid->r->pool); + bb = apr_brigade_create(cid->r->pool, c->bucket_alloc); b = apr_bucket_transient_create(shi->pszHeader + ate, - shi->cchHeader - ate); + shi->cchHeader - ate, + c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); - b = apr_bucket_flush_create(); + b = apr_bucket_flush_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); ap_pass_brigade(cid->r->output_filters, bb); } diff --git a/modules/cache/mod_file_cache.c b/modules/cache/mod_file_cache.c index c1682b5c5e..c16d4bf724 100644 --- a/modules/cache/mod_file_cache.c +++ b/modules/cache/mod_file_cache.c @@ -349,12 +349,14 @@ static int file_cache_xlat(request_rec *r) static int mmap_handler(request_rec *r, a_file *file) { #if APR_HAS_MMAP + conn_rec *c = r->connection; apr_bucket *b; - apr_bucket_brigade *bb = apr_brigade_create(r->pool); + apr_bucket_brigade *bb = apr_brigade_create(r->pool, c->bucket_alloc); - b = apr_bucket_mmap_create(file->mm, 0, (apr_size_t)file->finfo.size); + b = apr_bucket_mmap_create(file->mm, 0, (apr_size_t)file->finfo.size, + c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); - b = apr_bucket_eos_create(); + b = apr_bucket_eos_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); if (ap_pass_brigade(r->output_filters, bb) != APR_SUCCESS) @@ -366,13 +368,14 @@ static int mmap_handler(request_rec *r, a_file *file) static int sendfile_handler(request_rec *r, a_file *file) { #if APR_HAS_SENDFILE + conn_rec *c = r->connection; apr_bucket *b; - apr_bucket_brigade *bb = apr_brigade_create(r->pool); + apr_bucket_brigade *bb = apr_brigade_create(r->pool, c->bucket_alloc); - b = apr_bucket_file_create(file->file, 0, - (apr_size_t)file->finfo.size, r->pool); + b = apr_bucket_file_create(file->file, 0, (apr_size_t)file->finfo.size, + r->pool, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); - b = apr_bucket_eos_create(); + b = apr_bucket_eos_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); if (ap_pass_brigade(r->output_filters, bb) != APR_SUCCESS) diff --git a/modules/dav/fs/repos.c b/modules/dav/fs/repos.c index 5846cdfbc7..0333ea7da5 100644 --- a/modules/dav/fs/repos.c +++ b/modules/dav/fs/repos.c @@ -59,6 +59,7 @@ #include "apr.h" #include "apr_file_io.h" #include "apr_strings.h" +#include "apr_buckets.h" #if APR_HAVE_STDIO_H #include /* for sprintf() */ @@ -995,15 +996,15 @@ static dav_error * dav_fs_deliver(const dav_resource *resource, "File permissions deny server access."); } - bb = apr_brigade_create(pool); + bb = apr_brigade_create(pool, output->c->bucket_alloc); /* ### this does not handle large files. but this is test code anyway */ bkt = apr_bucket_file_create(fd, 0, (apr_size_t)resource->info->finfo.size, - pool); + pool, output->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, bkt); - bkt = apr_bucket_eos_create(); + bkt = apr_bucket_eos_create(output->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, bkt); if ((status = ap_pass_brigade(output, bb)) != APR_SUCCESS) { diff --git a/modules/echo/mod_echo.c b/modules/echo/mod_echo.c index 42290124d6..d7084e3375 100644 --- a/modules/echo/mod_echo.c +++ b/modules/echo/mod_echo.c @@ -101,7 +101,7 @@ static int process_echo_connection(conn_rec *c) return DECLINED; } - bb = apr_brigade_create(c->pool); + bb = apr_brigade_create(c->pool, c->bucket_alloc); for ( ; ; ) { /* Get a single line of input from the client */ @@ -113,7 +113,7 @@ static int process_echo_connection(conn_rec *c) } /* Make sure the data is flushed to the client */ - b = apr_bucket_flush_create(); + b = apr_bucket_flush_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); ap_pass_brigade(c->output_filters, bb); } diff --git a/modules/experimental/mod_cache.c b/modules/experimental/mod_cache.c index d05fca04dc..6a5d5ca3c0 100644 --- a/modules/experimental/mod_cache.c +++ b/modules/experimental/mod_cache.c @@ -202,6 +202,7 @@ static int cache_url_handler(request_rec *r, int lookup) /* cache file exists */ if (cache->fresh) { apr_bucket_brigade *out; + conn_rec *c = r->connection; /* fresh data available */ if (lookup) { @@ -227,7 +228,7 @@ static int cache_url_handler(request_rec *r, int lookup) ap_add_output_filter("CACHE_OUT", NULL, r, r->connection); /* kick off the filter stack */ - out = apr_brigade_create(r->pool); + out = apr_brigade_create(r->pool, c->bucket_alloc); if (APR_SUCCESS != (rv = ap_pass_brigade(r->output_filters, out))) { ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, "cache: error returned while trying to return %s " diff --git a/modules/experimental/mod_case_filter.c b/modules/experimental/mod_case_filter.c index c19fa928a9..ef7ee00fd2 100644 --- a/modules/experimental/mod_case_filter.c +++ b/modules/experimental/mod_case_filter.c @@ -40,11 +40,12 @@ static void CaseFilterInsertFilter(request_rec *r) static apr_status_t CaseFilterOutFilter(ap_filter_t *f, apr_bucket_brigade *pbbIn) { + request_rec *r = f->r; + conn_rec *c = r->connection; apr_bucket *pbktIn; apr_bucket_brigade *pbbOut; - /* XXX: is this the most appropriate pool? */ - pbbOut=apr_brigade_create(f->r->pool); + pbbOut=apr_brigade_create(r->pool, c->bucket_alloc); APR_BRIGADE_FOREACH(pbktIn,pbbIn) { const char *data; @@ -55,8 +56,7 @@ static apr_status_t CaseFilterOutFilter(ap_filter_t *f, if(APR_BUCKET_IS_EOS(pbktIn)) { - /* XXX: why can't I reuse pbktIn??? */ - apr_bucket *pbktEOS=apr_bucket_eos_create(); + apr_bucket *pbktEOS=apr_bucket_eos_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(pbbOut,pbktEOS); continue; } @@ -65,11 +65,12 @@ static apr_status_t CaseFilterOutFilter(ap_filter_t *f, apr_bucket_read(pbktIn,&data,&len,APR_BLOCK_READ); /* write */ - buf=malloc(len); + buf = apr_bucket_alloc(len, c->bucket_alloc); for(n=0 ; n < len ; ++n) buf[n]=toupper(data[n]); - pbktOut=apr_bucket_heap_create(buf,len,0); + pbktOut = apr_bucket_heap_create(buf, len, apr_bucket_free, + c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(pbbOut,pbktOut); } diff --git a/modules/experimental/mod_case_filter_in.c b/modules/experimental/mod_case_filter_in.c index 1bff66d836..4d00261884 100644 --- a/modules/experimental/mod_case_filter_in.c +++ b/modules/experimental/mod_case_filter_in.c @@ -105,12 +105,13 @@ static apr_status_t CaseFilterInFilter(ap_filter_t *f, apr_off_t nBytes) { request_rec *r = f->r; + conn_rec *c = r->connection; CaseFilterInContext *pCtx; apr_status_t ret; if (!(pCtx = f->ctx)) { f->ctx = pCtx = apr_palloc(r->pool, sizeof *pCtx); - pCtx->pbbTmp = apr_brigade_create(r->pool); + pCtx->pbbTmp = apr_brigade_create(r->pool, c->bucket_alloc); } if (APR_BRIGADE_EMPTY(pCtx->pbbTmp)) { @@ -149,7 +150,7 @@ static apr_status_t CaseFilterInFilter(ap_filter_t *f, for(n=0 ; n < len ; ++n) buf[n] = toupper(data[n]); - pbktOut = apr_bucket_heap_create(buf, len, 0); + pbktOut = apr_bucket_heap_create(buf, len, 0, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(pbbOut, pbktOut); apr_bucket_delete(pbktIn); } diff --git a/modules/experimental/mod_charset_lite.c b/modules/experimental/mod_charset_lite.c index 7b99ddc331..a01e5d32c5 100644 --- a/modules/experimental/mod_charset_lite.c +++ b/modules/experimental/mod_charset_lite.c @@ -347,7 +347,8 @@ static int find_code_page(request_rec *r) * of it. */ input_ctx = apr_pcalloc(r->pool, sizeof(charset_filter_ctx_t)); - input_ctx->bb = apr_brigade_create(r->pool); + input_ctx->bb = apr_brigade_create(r->pool, + r->connection->bucket_alloc); input_ctx->tmp = apr_palloc(r->pool, INPUT_XLATE_BUF_SIZE); input_ctx->dc = dc; reqinfo->input_ctx = input_ctx; @@ -443,13 +444,15 @@ static void xlate_insert_filter(request_rec *r) */ static apr_status_t send_downstream(ap_filter_t *f, const char *tmp, apr_size_t len) { + request_rec *r = f->r; + conn_rec *c = r->connection; apr_bucket_brigade *bb; apr_bucket *b; charset_filter_ctx_t *ctx = f->ctx; apr_status_t rv; - bb = apr_brigade_create(f->r->pool); - b = apr_bucket_transient_create(tmp, len); + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_transient_create(tmp, len, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); rv = ap_pass_brigade(f->next, bb); if (rv != APR_SUCCESS) { @@ -460,13 +463,15 @@ static apr_status_t send_downstream(ap_filter_t *f, const char *tmp, apr_size_t static apr_status_t send_eos(ap_filter_t *f) { + request_rec *r = f->r; + conn_rec *c = r->connection; apr_bucket_brigade *bb; apr_bucket *b; charset_filter_ctx_t *ctx = f->ctx; apr_status_t rv; - bb = apr_brigade_create(f->r->pool); - b = apr_bucket_eos_create(); + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_eos_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); rv = ap_pass_brigade(f->next, bb); if (rv != APR_SUCCESS) { @@ -1053,7 +1058,8 @@ static int xlate_in_filter(ap_filter_t *f, apr_bucket_brigade *bb, apr_bucket *e; e = apr_bucket_heap_create(ctx->tmp, - INPUT_XLATE_BUF_SIZE - buffer_size, 1); + INPUT_XLATE_BUF_SIZE - buffer_size, + NULL, f->r->connection->bucket_alloc); /* make sure we insert at the head, because there may be * an eos bucket already there, and the eos bucket should * come after the data diff --git a/modules/experimental/mod_deflate.c b/modules/experimental/mod_deflate.c index 7744aee1f4..58ad7f69f3 100644 --- a/modules/experimental/mod_deflate.c +++ b/modules/experimental/mod_deflate.c @@ -273,8 +273,8 @@ static apr_status_t deflate_out_filter(ap_filter_t *f, } /* We're cool with filtering this. */ - ctx = f->ctx = apr_pcalloc(f->r->pool, sizeof(*ctx)); - ctx->bb = apr_brigade_create(f->r->pool); + ctx = f->ctx = apr_pcalloc(r->pool, sizeof(*ctx)); + ctx->bb = apr_brigade_create(r->pool, f->c->bucket_alloc); /* ctx->stream.zalloc = (alloc_func) 0; ctx->stream.zfree = (free_func) 0; @@ -297,7 +297,7 @@ static apr_status_t deflate_out_filter(ap_filter_t *f, buf = apr_psprintf(r->pool, "%c%c%c%c%c%c%c%c%c%c", deflate_magic[0], deflate_magic[1], Z_DEFLATED, 0 /* flags */ , 0, 0, 0, 0 /* time */ , 0 /* xflags */ , OS_CODE); - e = apr_bucket_pool_create(buf, 10, r->pool); + e = apr_bucket_pool_create(buf, 10, r->pool, f->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(ctx->bb, e); apr_table_setn(r->headers_out, "Content-Encoding", "gzip"); @@ -323,7 +323,8 @@ static apr_status_t deflate_out_filter(ap_filter_t *f, if (deflate_len != 0) { b = apr_bucket_heap_create((char *)ctx->buffer, - deflate_len, 1); + deflate_len, NULL, + f->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(ctx->bb, b); ctx->stream.next_out = ctx->buffer; ctx->stream.avail_out = FILTER_BUFSIZE; @@ -359,7 +360,7 @@ static apr_status_t deflate_out_filter(ap_filter_t *f, *p++ = len_array[2]; *p++ = len_array[3]; - b = apr_bucket_pool_create(buf, 8, r->pool); + b = apr_bucket_pool_create(buf, 8, r->pool, f->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(ctx->bb, b); ap_log_rerror(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, 0, r, "Zlib: Compressed %ld to %ld : URL %s", @@ -421,7 +422,8 @@ static apr_status_t deflate_out_filter(ap_filter_t *f, ctx->stream.next_out = ctx->buffer; len = FILTER_BUFSIZE - ctx->stream.avail_out; - b = apr_bucket_heap_create((char *)ctx->buffer, len, 1); + b = apr_bucket_heap_create((char *)ctx->buffer, len, + NULL, f->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(ctx->bb, b); ctx->stream.avail_out = FILTER_BUFSIZE; } diff --git a/modules/experimental/mod_disk_cache.c b/modules/experimental/mod_disk_cache.c index a06f84ded5..00e75e1a1a 100644 --- a/modules/experimental/mod_disk_cache.c +++ b/modules/experimental/mod_disk_cache.c @@ -504,10 +504,10 @@ static apr_status_t read_body(cache_handle_t *h, apr_pool_t *p, apr_bucket_briga apr_bucket *e; disk_cache_object_t *dobj = (disk_cache_object_t*) h->cache_obj->vobj; - e = apr_bucket_file_create(dobj->fd, 0, dobj->file_size, p); - + e = apr_bucket_file_create(dobj->fd, 0, dobj->file_size, p, + bb->bucket_alloc); APR_BRIGADE_INSERT_HEAD(bb, e); - e = apr_bucket_eos_create(); + e = apr_bucket_eos_create(bb->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, e); return APR_SUCCESS; diff --git a/modules/experimental/mod_ext_filter.c b/modules/experimental/mod_ext_filter.c index 7d1f4f3488..f2e70d1962 100644 --- a/modules/experimental/mod_ext_filter.c +++ b/modules/experimental/mod_ext_filter.c @@ -532,6 +532,8 @@ static apr_status_t init_filter_instance(ap_filter_t *f) */ static apr_status_t drain_available_output(ap_filter_t *f) { + request_rec *r = f->r; + conn_rec *c = r->connection; ef_ctx_t *ctx = f->ctx; ef_dir_t *dc = ctx->dc; apr_size_t len; @@ -547,18 +549,18 @@ static apr_status_t drain_available_output(ap_filter_t *f) &len); if ((rv && !APR_STATUS_IS_EAGAIN(rv)) || dc->debug >= DBGLVL_GORY) { - ap_log_rerror(APLOG_MARK, APLOG_DEBUG, rv, f->r, + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, rv, r, "apr_file_read(child output), len %" APR_SIZE_T_FMT, !rv ? len : -1); } if (rv != APR_SUCCESS) { return rv; } - bb = apr_brigade_create(f->r->pool); - b = apr_bucket_transient_create(buf, len); + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_transient_create(buf, len, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); if ((rv = ap_pass_brigade(f->next, bb)) != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, f->r, + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "ap_pass_brigade()"); return rv; } @@ -632,6 +634,8 @@ static apr_status_t pass_data_to_filter(ap_filter_t *f, const char *data, static apr_status_t ef_output_filter(ap_filter_t *f, apr_bucket_brigade *bb) { + request_rec *r = f->r; + conn_rec *c = r->connection; ef_ctx_t *ctx = f->ctx; apr_bucket *b; ef_dir_t *dc; @@ -662,7 +666,7 @@ static apr_status_t ef_output_filter(ap_filter_t *f, apr_bucket_brigade *bb) rv = apr_bucket_read(b, &data, &len, APR_BLOCK_READ); if (rv != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, f->r, "apr_bucket_read()"); + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "apr_bucket_read()"); return rv; } @@ -682,7 +686,7 @@ static apr_status_t ef_output_filter(ap_filter_t *f, apr_bucket_brigade *bb) * that will cause the child to finish generating output */ if ((rv = apr_file_close(ctx->proc->in)) != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, f->r, + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "apr_file_close(child input)"); return rv; } @@ -690,9 +694,9 @@ static apr_status_t ef_output_filter(ap_filter_t *f, apr_bucket_brigade *bb) * timeout; we don't care if we don't return from apr_file_read() for a while... */ rv = apr_file_pipe_timeout_set(ctx->proc->out, - f->r->server->timeout * APR_USEC_PER_SEC); + r->server->timeout * APR_USEC_PER_SEC); if (rv) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, f->r, + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "apr_file_pipe_timeout_set(child output)"); return rv; } @@ -705,7 +709,7 @@ static apr_status_t ef_output_filter(ap_filter_t *f, apr_bucket_brigade *bb) &len); if ((rv && !APR_STATUS_IS_EOF(rv) && !APR_STATUS_IS_EAGAIN(rv)) || dc->debug >= DBGLVL_GORY) { - ap_log_rerror(APLOG_MARK, APLOG_DEBUG, rv, f->r, + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, rv, r, "apr_file_read(child output), len %" APR_SIZE_T_FMT, !rv ? len : -1); } @@ -718,11 +722,11 @@ static apr_status_t ef_output_filter(ap_filter_t *f, apr_bucket_brigade *bb) } if (rv == APR_SUCCESS) { - bb = apr_brigade_create(f->r->pool); - b = apr_bucket_transient_create(buf, len); + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_transient_create(buf, len, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); if ((rv = ap_pass_brigade(f->next, bb)) != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, f->r, + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "ap_pass_brigade(filtered buffer) failed"); return rv; } @@ -735,11 +739,11 @@ static apr_status_t ef_output_filter(ap_filter_t *f, apr_bucket_brigade *bb) if (eos) { /* pass down eos */ - bb = apr_brigade_create(f->r->pool); - b = apr_bucket_eos_create(); + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_eos_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); if ((rv = ap_pass_brigade(f->next, bb)) != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, f->r, + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "ap_pass_brigade(eos) failed"); return rv; } diff --git a/modules/experimental/mod_mem_cache.c b/modules/experimental/mod_mem_cache.c index d91ac17acb..650dd7d4c2 100644 --- a/modules/experimental/mod_mem_cache.c +++ b/modules/experimental/mod_mem_cache.c @@ -646,14 +646,14 @@ static apr_status_t read_body(cache_handle_t *h, apr_pool_t *p, apr_bucket_briga /* CACHE_TYPE_FILE */ apr_file_t *file; apr_os_file_put(&file, &mobj->fd, APR_READ|APR_XTHREAD, p); - b = apr_bucket_file_create(file, 0, mobj->m_len, p); + b = apr_bucket_file_create(file, 0, mobj->m_len, p, bb->bucket_alloc); } else { /* CACHE_TYPE_HEAP */ - b = apr_bucket_immortal_create(mobj->m, mobj->m_len); + b = apr_bucket_immortal_create(mobj->m, mobj->m_len, bb->bucket_alloc); } APR_BRIGADE_INSERT_TAIL(bb, b); - b = apr_bucket_eos_create(); + b = apr_bucket_eos_create(bb->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); return APR_SUCCESS; diff --git a/modules/filters/mod_include.c b/modules/filters/mod_include.c index c36bca0c99..9eb279553d 100644 --- a/modules/filters/mod_include.c +++ b/modules/filters/mod_include.c @@ -1358,6 +1358,7 @@ static int handle_echo(include_ctx_t *ctx, apr_bucket_brigade **bb, } } if (!strcmp(tag, "var")) { + conn_rec *c = r->connection; const char *val = get_include_var(r, ctx, ap_ssi_parse_string(r, ctx, tag_val, NULL, @@ -1377,7 +1378,7 @@ static int handle_echo(include_ctx_t *ctx, apr_bucket_brigade **bb, e_len = strlen(echo_text); tmp_buck = apr_bucket_pool_create(echo_text, e_len, - r->pool); + r->pool, c->bucket_alloc); } else { include_server_config *sconf= @@ -1385,7 +1386,7 @@ static int handle_echo(include_ctx_t *ctx, apr_bucket_brigade **bb, &include_module); tmp_buck = apr_bucket_pool_create(sconf->undefinedEcho, sconf->undefinedEchoLen, - r->pool); + r->pool, c->bucket_alloc); } APR_BUCKET_INSERT_BEFORE(head_ptr, tmp_buck); if (*inserted_head == NULL) { @@ -1623,7 +1624,8 @@ static int handle_fsize(include_ctx_t *ctx, apr_bucket_brigade **bb, s_len = pos; } - tmp_buck = apr_bucket_heap_create(buff, s_len, 1); + tmp_buck = apr_bucket_heap_create(buff, s_len, NULL, + r->connection->bucket_alloc); APR_BUCKET_INSERT_BEFORE(head_ptr, tmp_buck); if (*inserted_head == NULL) { *inserted_head = tmp_buck; @@ -1671,7 +1673,8 @@ static int handle_flastmod(include_ctx_t *ctx, apr_bucket_brigade **bb, t_val = ap_ht_time(r->pool, finfo.mtime, ctx->time_str, 0); t_len = strlen(t_val); - tmp_buck = apr_bucket_pool_create(t_val, t_len, r->pool); + tmp_buck = apr_bucket_pool_create(t_val, t_len, r->pool, + r->connection->bucket_alloc); APR_BUCKET_INSERT_BEFORE(head_ptr, tmp_buck); if (*inserted_head == NULL) { *inserted_head = tmp_buck; @@ -2504,8 +2507,9 @@ static int parse_expr(request_rec *r, include_ctx_t *ctx, const char *expr, if (cntx->flags & FLAG_COND_TRUE) { \ cond_txt[31] = '1'; \ } \ - memcpy(&cond_txt[5], tag_text, sizeof(tag_text)); \ - t_buck = apr_bucket_heap_create(cond_txt, sizeof(cond_txt), 1); \ + memcpy(&cond_txt[5], tag_text, sizeof(tag_text)-1); \ + t_buck = apr_bucket_heap_create(cond_txt, sizeof(cond_txt)-1, \ + NULL, h_ptr->list); \ APR_BUCKET_INSERT_BEFORE(h_ptr, t_buck); \ \ if (ins_head == NULL) { \ @@ -2515,7 +2519,8 @@ static int parse_expr(request_rec *r, include_ctx_t *ctx, const char *expr, #define DUMP_PARSE_EXPR_DEBUG(t_buck, h_ptr, d_buf, ins_head) \ { \ if (d_buf[0] != '\0') { \ - t_buck = apr_bucket_heap_create(d_buf, strlen(d_buf), 1); \ + t_buck = apr_bucket_heap_create(d_buf, strlen(d_buf), \ + NULL, h_ptr->list); \ APR_BUCKET_INSERT_BEFORE(h_ptr, t_buck); \ \ if (ins_head == NULL) { \ @@ -2591,7 +2596,8 @@ static int handle_if(include_ctx_t *ctx, apr_bucket_brigade **bb, if (1) { apr_size_t d_len = 0; d_len = sprintf(debug_buf, "**** if expr=\"%s\"\n", expr); - tmp_buck = apr_bucket_heap_create(debug_buf, d_len, 1); + tmp_buck = apr_bucket_heap_create(debug_buf, d_len, NULL, + r->connection->bucket_alloc); APR_BUCKET_INSERT_BEFORE(head_ptr, tmp_buck); if (*inserted_head == NULL) { @@ -2673,7 +2679,8 @@ static int handle_elif(include_ctx_t *ctx, apr_bucket_brigade **bb, if (1) { apr_size_t d_len = 0; d_len = sprintf(debug_buf, "**** elif expr=\"%s\"\n", expr); - tmp_buck = apr_bucket_heap_create(debug_buf, d_len, 1); + tmp_buck = apr_bucket_heap_create(debug_buf, d_len, NULL, + r->connection->bucket_alloc); APR_BUCKET_INSERT_BEFORE(head_ptr, tmp_buck); if (*inserted_head == NULL) { @@ -2854,7 +2861,8 @@ static int handle_printenv(include_ctx_t *ctx, apr_bucket_brigade **bb, *next++ = '\n'; *next = 0; tmp_buck = apr_bucket_pool_create(key_val, kv_length - 1, - r->pool); + r->pool, + r->connection->bucket_alloc); APR_BUCKET_INSERT_BEFORE(head_ptr, tmp_buck); if (*inserted_head == NULL) { *inserted_head = tmp_buck; @@ -2912,7 +2920,8 @@ static apr_status_t send_parsed_content(apr_bucket_brigade **bb, apr_bucket *tmp_bkt; tmp_bkt = apr_bucket_immortal_create(ctx->start_seq, - cleanup_bytes); + cleanup_bytes, + r->connection->bucket_alloc); APR_BRIGADE_INSERT_HEAD(*bb, tmp_bkt); apr_brigade_cleanup(ctx->ssi_tag_brigade); } @@ -2946,7 +2955,7 @@ static apr_status_t send_parsed_content(apr_bucket_brigade **bb, /* Send the large chunk of pre-tag bytes... */ tag_and_after = apr_brigade_split(*bb, tmp_dptr); if (ctx->output_flush) { - APR_BRIGADE_INSERT_TAIL(*bb, apr_bucket_flush_create()); + APR_BRIGADE_INSERT_TAIL(*bb, apr_bucket_flush_create((*bb)->bucket_alloc)); } rv = ap_pass_brigade(f->next, *bb); @@ -3281,7 +3290,8 @@ static apr_status_t includes_filter(ap_filter_t *f, apr_bucket_brigade *b) if (ap_allow_options(r) & OPT_INCNOEXEC) { ctx->flags |= FLAG_NO_EXEC; } - ctx->ssi_tag_brigade = apr_brigade_create(f->c->pool); + ctx->ssi_tag_brigade = apr_brigade_create(f->c->pool, + f->c->bucket_alloc); ctx->status = APR_SUCCESS; ctx->error_str = conf->default_error_msg; diff --git a/modules/filters/mod_include.h b/modules/filters/mod_include.h index bebf7f32b1..bd7ff9161e 100644 --- a/modules/filters/mod_include.h +++ b/modules/filters/mod_include.h @@ -189,7 +189,8 @@ typedef struct include_filter_ctx { { \ /* XXX: it'd probably be nice to use a pool bucket here */ \ t_buck = apr_bucket_heap_create(cntx->error_str, \ - strlen(cntx->error_str), 1); \ + strlen(cntx->error_str), \ + NULL, h_ptr->list); \ APR_BUCKET_INSERT_BEFORE(h_ptr, t_buck); \ \ if (ins_head == NULL) { \ @@ -208,7 +209,7 @@ if ((APR_BRIGADE_EMPTY((cntxt)->ssi_tag_brigade)) && \ \ tag_plus = apr_brigade_split((brgd), (cntxt)->head_start_bucket); \ if ((cntxt)->output_flush) { \ - APR_BRIGADE_INSERT_TAIL((brgd), apr_bucket_flush_create()); \ + APR_BRIGADE_INSERT_TAIL((brgd), apr_bucket_flush_create((brgd)->bucket_alloc)); \ } \ (rc) = ap_pass_brigade((next), (brgd)); \ (cntxt)->bytes_parsed = 0; \ diff --git a/modules/generators/mod_asis.c b/modules/generators/mod_asis.c index fff8e5cf84..acad6697f6 100644 --- a/modules/generators/mod_asis.c +++ b/modules/generators/mod_asis.c @@ -72,6 +72,7 @@ static int asis_handler(request_rec *r) { + conn_rec *c = r->connection; apr_file_t *f = NULL; apr_status_t rv; const char *location; @@ -130,7 +131,7 @@ static int asis_handler(request_rec *r) return HTTP_INTERNAL_SERVER_ERROR; } - bb = apr_brigade_create(r->pool); + bb = apr_brigade_create(r->pool, c->bucket_alloc); #if APR_HAS_LARGE_FILES if (r->finfo.size - pos > AP_MAX_SENDFILE) { /* APR_HAS_LARGE_FILES issue; must split into mutiple buckets, @@ -138,7 +139,8 @@ static int asis_handler(request_rec *r) * in case the brigade code/filters attempt to read it directly. */ apr_off_t fsize = r->finfo.size - pos; - b = apr_bucket_file_create(f, pos, AP_MAX_SENDFILE, r->pool); + b = apr_bucket_file_create(f, pos, AP_MAX_SENDFILE, + r->pool, c->bucket_alloc); while (fsize > AP_MAX_SENDFILE) { APR_BRIGADE_INSERT_TAIL(bb, b); apr_bucket_copy(b, &b); @@ -149,9 +151,10 @@ static int asis_handler(request_rec *r) } else #endif - b = apr_bucket_file_create(f, pos, (apr_size_t) (r->finfo.size - pos), r->pool); + b = apr_bucket_file_create(f, pos, (apr_size_t) (r->finfo.size - pos), + r->pool, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); - b = apr_bucket_eos_create(); + b = apr_bucket_eos_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); rv = ap_pass_brigade(r->output_filters, bb); if (rv != APR_SUCCESS) { diff --git a/modules/generators/mod_cgi.c b/modules/generators/mod_cgi.c index 9470473dbd..2784359964 100644 --- a/modules/generators/mod_cgi.c +++ b/modules/generators/mod_cgi.c @@ -702,14 +702,15 @@ static int cgi_handler(request_rec *r) /* Handle script return... */ if (script_in && !nph) { + conn_rec *c = r->connection; const char *location; char sbuf[MAX_STRING_LEN]; int ret; - bb = apr_brigade_create(r->pool); - b = apr_bucket_pipe_create(script_in); + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_pipe_create(script_in, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); - b = apr_bucket_eos_create(); + b = apr_bucket_eos_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); if ((ret = ap_scan_script_header_err_brigade(r, bb, sbuf))) { @@ -755,6 +756,7 @@ static int cgi_handler(request_rec *r) } if (script_in && nph) { + conn_rec *c = r->connection; struct ap_filter_t *cur; /* get rid of all filters up through protocol... since we @@ -768,10 +770,10 @@ static int cgi_handler(request_rec *r) } r->output_filters = r->proto_output_filters = cur; - bb = apr_brigade_create(r->pool); - b = apr_bucket_pipe_create(script_in); + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_pipe_create(script_in, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); - b = apr_bucket_eos_create(); + b = apr_bucket_eos_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); ap_pass_brigade(r->output_filters, bb); } @@ -825,6 +827,7 @@ static int include_cgi(char *s, request_rec *r, ap_filter_t *next, if (ap_is_HTTP_REDIRECT(rr_status)) { apr_size_t len_loc; const char *location = apr_table_get(rr->headers_out, "Location"); + conn_rec *c = r->connection; location = ap_escape_html(rr->pool, location); len_loc = strlen(location); @@ -834,15 +837,20 @@ static int include_cgi(char *s, request_rec *r, ap_filter_t *next, * and a single pool bucket */ tmp_buck = apr_bucket_immortal_create("bucket_alloc); APR_BUCKET_INSERT_BEFORE(head_ptr, tmp_buck); - tmp2_buck = apr_bucket_heap_create(location, len_loc, 1); + tmp2_buck = apr_bucket_heap_create(location, len_loc, NULL, + c->bucket_alloc); APR_BUCKET_INSERT_BEFORE(head_ptr, tmp2_buck); - tmp2_buck = apr_bucket_immortal_create("\">", sizeof("\">") - 1); + tmp2_buck = apr_bucket_immortal_create("\">", sizeof("\">") - 1, + c->bucket_alloc); APR_BUCKET_INSERT_BEFORE(head_ptr, tmp2_buck); - tmp2_buck = apr_bucket_heap_create(location, len_loc, 1); + tmp2_buck = apr_bucket_heap_create(location, len_loc, NULL, + c->bucket_alloc); APR_BUCKET_INSERT_BEFORE(head_ptr, tmp2_buck); - tmp2_buck = apr_bucket_immortal_create("", sizeof("") - 1); + tmp2_buck = apr_bucket_immortal_create("", sizeof("") - 1, + c->bucket_alloc); APR_BUCKET_INSERT_BEFORE(head_ptr, tmp2_buck); if (*inserted_head == NULL) { @@ -890,8 +898,8 @@ static int include_cmd(include_ctx_t *ctx, apr_bucket_brigade **bb, return HTTP_INTERNAL_SERVER_ERROR; } - bcgi = apr_brigade_create(r->pool); - b = apr_bucket_pipe_create(script_in); + bcgi = apr_brigade_create(r->pool, f->c->bucket_alloc); + b = apr_bucket_pipe_create(script_in, f->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bcgi, b); ap_pass_brigade(f->next, bcgi); diff --git a/modules/generators/mod_cgid.c b/modules/generators/mod_cgid.c index 52994e03c3..a42f43b779 100644 --- a/modules/generators/mod_cgid.c +++ b/modules/generators/mod_cgid.c @@ -975,6 +975,7 @@ static int connect_to_daemon(int *sdptr, request_rec *r, */ static int cgid_handler(request_rec *r) { + conn_rec *c = r->connection; int retval, nph, dbpos = 0; char *argv0, *dbuf = NULL; apr_bucket_brigade *bb; @@ -1156,10 +1157,10 @@ static int cgid_handler(request_rec *r) */ apr_pool_cleanup_kill(r->pool, (void *)sd, close_unix_socket); - bb = apr_brigade_create(r->pool); - b = apr_bucket_pipe_create(tempsock); + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_pipe_create(tempsock, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); - b = apr_bucket_eos_create(); + b = apr_bucket_eos_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); ap_pass_brigade(r->output_filters, bb); } @@ -1185,10 +1186,10 @@ static int cgid_handler(request_rec *r) } r->output_filters = r->proto_output_filters = cur; - bb = apr_brigade_create(r->pool); - b = apr_bucket_pipe_create(tempsock); + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_pipe_create(tempsock, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); - b = apr_bucket_eos_create(); + b = apr_bucket_eos_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); ap_pass_brigade(r->output_filters, bb); } @@ -1244,6 +1245,7 @@ static int include_cgi(char *s, request_rec *r, ap_filter_t *next, if (ap_is_HTTP_REDIRECT(rr_status)) { apr_size_t len_loc; const char *location = apr_table_get(rr->headers_out, "Location"); + conn_rec *c = r->connection; location = ap_escape_html(rr->pool, location); len_loc = strlen(location); @@ -1253,15 +1255,20 @@ static int include_cgi(char *s, request_rec *r, ap_filter_t *next, * and a single pool bucket */ tmp_buck = apr_bucket_immortal_create("bucket_alloc); APR_BUCKET_INSERT_BEFORE(head_ptr, tmp_buck); - tmp2_buck = apr_bucket_heap_create(location, len_loc, 1); + tmp2_buck = apr_bucket_heap_create(location, len_loc, NULL, + c->bucket_alloc); APR_BUCKET_INSERT_BEFORE(head_ptr, tmp2_buck); - tmp2_buck = apr_bucket_immortal_create("\">", sizeof("\">") - 1); + tmp2_buck = apr_bucket_immortal_create("\">", sizeof("\">") - 1, + c->bucket_alloc); APR_BUCKET_INSERT_BEFORE(head_ptr, tmp2_buck); - tmp2_buck = apr_bucket_heap_create(location, len_loc, 1); + tmp2_buck = apr_bucket_heap_create(location, len_loc, NULL, + c->bucket_alloc); APR_BUCKET_INSERT_BEFORE(head_ptr, tmp2_buck); - tmp2_buck = apr_bucket_immortal_create("", sizeof("") - 1); + tmp2_buck = apr_bucket_immortal_create("", sizeof("") - 1, + c->bucket_alloc); APR_BUCKET_INSERT_BEFORE(head_ptr, tmp2_buck); if (*inserted_head == NULL) { @@ -1381,8 +1388,8 @@ static int include_cmd(include_ctx_t *ctx, apr_bucket_brigade **bb, char *comman */ apr_pool_cleanup_kill(r->pool, (void *)sd, close_unix_socket); - bcgi = apr_brigade_create(r->pool); - b = apr_bucket_pipe_create(tempsock); + bcgi = apr_brigade_create(r->pool, r->connection->bucket_alloc); + b = apr_bucket_pipe_create(tempsock, r->connection->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bcgi, b); ap_pass_brigade(f->next, bcgi); } diff --git a/modules/http/http_core.c b/modules/http/http_core.c index da9b045b5d..61b15fa8af 100644 --- a/modules/http/http_core.c +++ b/modules/http/http_core.c @@ -144,6 +144,7 @@ static apr_status_t chunk_filter(ap_filter_t *f, apr_bucket_brigade *b) { #define ASCII_CRLF "\015\012" #define ASCII_ZERO "\060" + conn_rec *c = f->r->connection; apr_bucket_brigade *more; apr_bucket *e; apr_status_t rv; @@ -214,14 +215,15 @@ static apr_status_t chunk_filter(ap_filter_t *f, apr_bucket_brigade *b) hdr_len = apr_snprintf(chunk_hdr, sizeof(chunk_hdr), "%qx" CRLF, (apr_uint64_t)bytes); ap_xlate_proto_to_ascii(chunk_hdr, hdr_len); - e = apr_bucket_transient_create(chunk_hdr, hdr_len); + e = apr_bucket_transient_create(chunk_hdr, hdr_len, + c->bucket_alloc); APR_BRIGADE_INSERT_HEAD(b, e); /* * Insert the end-of-chunk CRLF before an EOS or * FLUSH bucket, or appended to the brigade */ - e = apr_bucket_immortal_create(ASCII_CRLF, 2); + e = apr_bucket_immortal_create(ASCII_CRLF, 2, c->bucket_alloc); if (eos != NULL) { APR_BUCKET_INSERT_BEFORE(eos, e); } @@ -248,7 +250,9 @@ static apr_status_t chunk_filter(ap_filter_t *f, apr_bucket_brigade *b) */ if (eos != NULL) { /* XXX: (2) trailers ... does not yet exist */ - e = apr_bucket_immortal_create(ASCII_ZERO ASCII_CRLF /* */ ASCII_CRLF, 5); + e = apr_bucket_immortal_create(ASCII_ZERO ASCII_CRLF + /* */ + ASCII_CRLF, 5, c->bucket_alloc); APR_BUCKET_INSERT_BEFORE(eos, e); } diff --git a/modules/http/http_protocol.c b/modules/http/http_protocol.c index 35ef816ed2..c6a54b653d 100644 --- a/modules/http/http_protocol.c +++ b/modules/http/http_protocol.c @@ -739,11 +739,12 @@ apr_status_t ap_http_filter(ap_filter_t *f, apr_bucket_brigade *b, } if (!ctx->remaining) { + conn_rec *c = f->r->connection; switch (ctx->state) { case BODY_NONE: break; case BODY_LENGTH: - e = apr_bucket_eos_create(); + e = apr_bucket_eos_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(b, e); return APR_SUCCESS; case BODY_CHUNK: @@ -766,7 +767,7 @@ apr_status_t ap_http_filter(ap_filter_t *f, apr_bucket_brigade *b, if (!ctx->remaining) { /* Handle trailers by calling get_mime_headers again! */ - e = apr_bucket_eos_create(); + e = apr_bucket_eos_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(b, e); return APR_SUCCESS; } @@ -1164,7 +1165,7 @@ AP_DECLARE_NONSTD(int) ap_send_http_trace(request_rec *r) /* Now we recreate the request, and echo it back */ - b = apr_brigade_create(r->pool); + b = apr_brigade_create(r->pool, r->connection->bucket_alloc); apr_brigade_putstrs(b, NULL, NULL, r->the_request, CRLF, NULL); h.pool = r->pool; h.bb = b; @@ -1290,6 +1291,7 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_http_header_filter(ap_filter_t *f, { int i; request_rec *r = f->r; + conn_rec *c = r->connection; const char *clheader; const char *protocol; apr_bucket *e; @@ -1416,7 +1418,7 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_http_header_filter(ap_filter_t *f, apr_table_unset(r->headers_out, "Content-Length"); } - b2 = apr_brigade_create(r->pool); + b2 = apr_brigade_create(r->pool, c->bucket_alloc); basic_http_header(r, b2, protocol); h.pool = r->pool; @@ -1575,6 +1577,7 @@ AP_DECLARE(int) ap_should_client_block(request_rec *r) } if (r->expecting_100 && r->proto_num >= HTTP_VERSION(1,1)) { + conn_rec *c = r->connection; char *tmp; apr_bucket *e; apr_bucket_brigade *bb; @@ -1582,10 +1585,10 @@ AP_DECLARE(int) ap_should_client_block(request_rec *r) /* sending 100 Continue interim response */ tmp = apr_pstrcat(r->pool, AP_SERVER_PROTOCOL, " ", status_lines[0], CRLF CRLF, NULL); - bb = apr_brigade_create(r->pool); - e = apr_bucket_pool_create(tmp, strlen(tmp), r->pool); + bb = apr_brigade_create(r->pool, c->bucket_alloc); + e = apr_bucket_pool_create(tmp, strlen(tmp), r->pool, c->bucket_alloc); APR_BRIGADE_INSERT_HEAD(bb, e); - e = apr_bucket_flush_create(); + e = apr_bucket_flush_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, e); ap_pass_brigade(r->connection->output_filters, bb); @@ -2585,6 +2588,7 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_byterange_filter(ap_filter_t *f, { #define MIN_LENGTH(len1, len2) ((len1 > len2) ? len2 : len1) request_rec *r = f->r; + conn_rec *c = r->connection; byterange_ctx *ctx = f->ctx; apr_bucket *e; apr_bucket_brigade *bsend; @@ -2602,11 +2606,11 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_byterange_filter(ap_filter_t *f, if (num_ranges == -1) { ap_remove_output_filter(f); - bsend = apr_brigade_create(r->pool); + bsend = apr_brigade_create(r->pool, c->bucket_alloc); e = ap_bucket_error_create(HTTP_RANGE_NOT_SATISFIABLE, NULL, - r->pool); + r->pool, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bsend, e); - e = apr_bucket_eos_create(); + e = apr_bucket_eos_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bsend, e); return ap_pass_brigade(f->next, bsend); } @@ -2627,7 +2631,7 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_byterange_filter(ap_filter_t *f, } /* create a brigade in case we never call ap_save_brigade() */ - ctx->bb = apr_brigade_create(r->pool); + ctx->bb = apr_brigade_create(r->pool, c->bucket_alloc); } /* We can't actually deal with byte-ranges until we have the whole brigade @@ -2664,7 +2668,7 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_byterange_filter(ap_filter_t *f, clength = (apr_off_t)bb_length; /* this brigade holds what we will be sending */ - bsend = apr_brigade_create(r->pool); + bsend = apr_brigade_create(r->pool, c->bucket_alloc); while ((current = ap_getword(r->pool, &r->range, ',')) && (rv = parse_byterange(current, clength, &range_start, @@ -2695,14 +2699,15 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_byterange_filter(ap_filter_t *f, if (ctx->num_ranges > 1) { char *ts; - e = apr_bucket_pool_create(bound_head, - strlen(bound_head), r->pool); + e = apr_bucket_pool_create(bound_head, strlen(bound_head), + r->pool, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bsend, e); ts = apr_psprintf(r->pool, BYTERANGE_FMT CRLF CRLF, range_start, range_end, clength); ap_xlate_proto_to_ascii(ts, strlen(ts)); - e = apr_bucket_pool_create(ts, strlen(ts), r->pool); + e = apr_bucket_pool_create(ts, strlen(ts), r->pool, + c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bsend, e); } @@ -2739,11 +2744,11 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_byterange_filter(ap_filter_t *f, /* add the final boundary */ end = apr_pstrcat(r->pool, CRLF "--", r->boundary, "--" CRLF, NULL); ap_xlate_proto_to_ascii(end, strlen(end)); - e = apr_bucket_pool_create(end, strlen(end), r->pool); + e = apr_bucket_pool_create(end, strlen(end), r->pool, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bsend, e); } - e = apr_bucket_eos_create(); + e = apr_bucket_eos_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bsend, e); /* we're done with the original content */ diff --git a/modules/http/http_request.c b/modules/http/http_request.c index 36b1ceed12..07e4de542c 100644 --- a/modules/http/http_request.c +++ b/modules/http/http_request.c @@ -207,10 +207,11 @@ AP_DECLARE(void) ap_die(int type, request_rec *r) static void check_pipeline_flush(request_rec *r) { + conn_rec *c = r->connection; /* ### if would be nice if we could PEEK without a brigade. that would ### allow us to defer creation of the brigade to when we actually ### need to send a FLUSH. */ - apr_bucket_brigade *bb = apr_brigade_create(r->pool); + apr_bucket_brigade *bb = apr_brigade_create(r->pool, c->bucket_alloc); /* Flush the filter contents if: * @@ -222,7 +223,7 @@ static void check_pipeline_flush(request_rec *r) if (!r->connection->keepalive || ap_get_brigade(r->input_filters, bb, AP_MODE_EATCRLF, APR_NONBLOCK_READ, 0) != APR_SUCCESS) { - apr_bucket *e = apr_bucket_flush_create(); + apr_bucket *e = apr_bucket_flush_create(c->bucket_alloc); /* We just send directly to the connection based filters. At * this point, we know that we have seen all of the data diff --git a/modules/mappers/mod_negotiation.c b/modules/mappers/mod_negotiation.c index c0d870bfaf..2e1a5a97a7 100644 --- a/modules/mappers/mod_negotiation.c +++ b/modules/mappers/mod_negotiation.c @@ -2813,6 +2813,7 @@ static int handle_map_file(request_rec *r) if (best->body) { + conn_rec *c = r->connection; apr_bucket_brigade *bb; apr_bucket *e; @@ -2840,11 +2841,12 @@ static int handle_map_file(request_rec *r) return res; } - bb = apr_brigade_create(r->pool); + bb = apr_brigade_create(r->pool, c->bucket_alloc); e = apr_bucket_file_create(map, best->body, - (apr_size_t)best->bytes, r->pool); + (apr_size_t)best->bytes, r->pool, + c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, e); - e = apr_bucket_eos_create(); + e = apr_bucket_eos_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, e); return ap_pass_brigade(r->output_filters, bb); diff --git a/modules/proxy/proxy_ftp.c b/modules/proxy/proxy_ftp.c index b62492d94e..3e599e0571 100644 --- a/modules/proxy/proxy_ftp.c +++ b/modules/proxy/proxy_ftp.c @@ -315,8 +315,9 @@ typedef struct { apr_status_t ap_proxy_send_dir_filter(ap_filter_t *f, apr_bucket_brigade *in) { request_rec *r = f->r; + conn_rec *c = r->connection; apr_pool_t *p = r->pool; - apr_bucket_brigade *out = apr_brigade_create(p); + apr_bucket_brigade *out = apr_brigade_create(p, c->bucket_alloc); apr_status_t rv; register int n; @@ -329,7 +330,7 @@ apr_status_t ap_proxy_send_dir_filter(ap_filter_t *f, apr_bucket_brigade *in) if (!ctx) { f->ctx = ctx = apr_pcalloc(p, sizeof(*ctx)); - ctx->in = apr_brigade_create(p); + ctx->in = apr_brigade_create(p, c->bucket_alloc); ctx->buffer[0] = 0; ctx->state = HEADER; } @@ -387,7 +388,8 @@ apr_status_t ap_proxy_send_dir_filter(ap_filter_t *f, apr_bucket_brigade *in) site, basedir, ap_escape_uri(p, path), site, str); - APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(str, strlen(str), p)); + APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(str, strlen(str), + p, c->bucket_alloc)); for (dir = path+1; (dir = strchr(dir, '/')) != NULL; ) { @@ -404,10 +406,14 @@ apr_status_t ap_proxy_send_dir_filter(ap_filter_t *f, apr_bucket_brigade *in) *dir = '/'; while (*dir == '/') ++dir; - APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(str, strlen(str), p)); + APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(str, + strlen(str), p, + c->bucket_alloc)); } if (wildcard != NULL) { - APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(wildcard, strlen(wildcard), p)); + APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(wildcard, + strlen(wildcard), p, + c->bucket_alloc)); } /* If the caller has determined the current directory, and it differs */ @@ -419,18 +425,21 @@ apr_status_t ap_proxy_send_dir_filter(ap_filter_t *f, apr_bucket_brigade *in) str = apr_psprintf(p, "\n\n(%s)\n\n
\n\n
",
                                ap_escape_html(p, pwd));
         }
-        APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(str, strlen(str), p));
+        APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(str, strlen(str),
+                                                           p, c->bucket_alloc));
 
         /* print README */
         if (readme) {
             str = apr_psprintf(p, "%s\n
\n\n
\n\n
\n",
                                ap_escape_html(p, readme));
 
-            APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(str, strlen(str), p));
+            APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(str,
+                                                           strlen(str), p,
+                                                           c->bucket_alloc));
         }
 
         /* make sure page intro gets sent out */
-        APR_BRIGADE_INSERT_TAIL(out, apr_bucket_flush_create());
+        APR_BRIGADE_INSERT_TAIL(out, apr_bucket_flush_create(c->bucket_alloc));
         if (APR_SUCCESS != (rv = ap_pass_brigade(f->next, out))) {
             return rv;
         }
@@ -581,8 +590,9 @@ apr_status_t ap_proxy_send_dir_filter(ap_filter_t *f, apr_bucket_brigade *in)
         /* erase buffer for next time around */
         ctx->buffer[0] = 0;
 
-        APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(str, strlen(str), p));
-        APR_BRIGADE_INSERT_TAIL(out, apr_bucket_flush_create());
+        APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(str, strlen(str), p,
+                                                            c->bucket_alloc));
+        APR_BRIGADE_INSERT_TAIL(out, apr_bucket_flush_create(c->bucket_alloc));
         if (APR_SUCCESS != (rv = ap_pass_brigade(f->next, out))) {
             return rv;
         }
@@ -592,9 +602,10 @@ apr_status_t ap_proxy_send_dir_filter(ap_filter_t *f, apr_bucket_brigade *in)
 
     if (FOOTER == ctx->state) {
         str = apr_psprintf(p, "
\n\n
\n\n %s\n\n \n\n", ap_psignature("", r)); - APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(str, strlen(str), p)); - APR_BRIGADE_INSERT_TAIL(out, apr_bucket_flush_create()); - APR_BRIGADE_INSERT_TAIL(out, apr_bucket_eos_create()); + APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(str, strlen(str), p, + c->bucket_alloc)); + APR_BRIGADE_INSERT_TAIL(out, apr_bucket_flush_create(c->bucket_alloc)); + APR_BRIGADE_INSERT_TAIL(out, apr_bucket_eos_create(c->bucket_alloc)); if (APR_SUCCESS != (rv = ap_pass_brigade(f->next, out))) { return rv; } @@ -619,9 +630,9 @@ proxy_ftp_command(const char *cmd, request_rec *r, conn_rec *ftp_ctrl, /* If cmd == NULL, we retrieve the next ftp response line */ if (cmd != NULL) { - - APR_BRIGADE_INSERT_TAIL(bb, apr_bucket_pool_create(cmd, strlen(cmd), r->pool)); - APR_BRIGADE_INSERT_TAIL(bb, apr_bucket_flush_create()); + conn_rec *c = r->connection; + APR_BRIGADE_INSERT_TAIL(bb, apr_bucket_pool_create(cmd, strlen(cmd), r->pool, c->bucket_alloc)); + APR_BRIGADE_INSERT_TAIL(bb, apr_bucket_flush_create(c->bucket_alloc)); ap_pass_brigade(ftp_ctrl->output_filters, bb); /* strip off the CRLF for logging */ @@ -768,7 +779,7 @@ int ap_proxy_ftp_handler(request_rec *r, proxy_server_conf *conf, apr_status_t rv; conn_rec *origin, *data = NULL; int err; - apr_bucket_brigade *bb = apr_brigade_create(p); + apr_bucket_brigade *bb = apr_brigade_create(p, c->bucket_alloc); char *buf, *connectname; apr_port_t connectport; char buffer[MAX_STRING_LEN]; @@ -1013,7 +1024,8 @@ int ap_proxy_ftp_handler(request_rec *r, proxy_server_conf *conf, } /* the socket is now open, create a new connection */ - origin = ap_run_create_connection(p, r->server, sock, r->connection->id, r->connection->sbh); + origin = ap_run_create_connection(p, r->server, sock, r->connection->id, + r->connection->sbh, c->bucket_alloc); if (!origin) { /* * the peer reset the connection already; ap_run_create_connection() closed @@ -1084,7 +1096,6 @@ int ap_proxy_ftp_handler(request_rec *r, proxy_server_conf *conf, return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage); } - rc = proxy_ftp_command(apr_pstrcat(p, "USER ", user, CRLF, NULL), r, origin, bb, &ftpmessage); /* possible results; 230, 331, 332, 421, 500, 501, 530 */ @@ -1774,7 +1785,8 @@ int ap_proxy_ftp_handler(request_rec *r, proxy_server_conf *conf, } /* the transfer socket is now open, create a new connection */ - data = ap_run_create_connection(p, r->server, data_sock, r->connection->id, r->connection->sbh); + data = ap_run_create_connection(p, r->server, data_sock, r->connection->id, + r->connection->sbh, c->bucket_alloc); if (!data) { /* * the peer reset the connection already; ap_run_create_connection() closed @@ -1849,7 +1861,7 @@ int ap_proxy_ftp_handler(request_rec *r, proxy_server_conf *conf, /* if no EOS yet, then we must flush */ if (FALSE == finish) { - e = apr_bucket_flush_create(); + e = apr_bucket_flush_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, e); } diff --git a/modules/proxy/proxy_http.c b/modules/proxy/proxy_http.c index f37785d4ad..0855114d4d 100644 --- a/modules/proxy/proxy_http.c +++ b/modules/proxy/proxy_http.c @@ -375,7 +375,8 @@ apr_status_t ap_proxy_http_create_connection(apr_pool_t *p, request_rec *r, /* the socket is now open, create a new backend server connection */ *origin = ap_run_create_connection(c->pool, r->server, p_conn->sock, - r->connection->id, r->connection->sbh); + r->connection->id, + r->connection->sbh, c->bucket_alloc); if (!origin) { /* the peer reset the connection already; ap_run_create_connection() * closed the socket @@ -412,6 +413,7 @@ apr_status_t ap_proxy_http_request(apr_pool_t *p, request_rec *r, apr_uri_t *uri, char *url, apr_bucket_brigade *bb, char *server_portstr) { + conn_rec *c = r->connection; char buffer[HUGE_STRING_LEN]; char *buf; apr_bucket *e; @@ -442,7 +444,7 @@ apr_status_t ap_proxy_http_request(apr_pool_t *p, request_rec *r, } buf = apr_pstrcat(p, r->method, " ", url, " HTTP/1.1" CRLF, NULL); - e = apr_bucket_pool_create(buf, strlen(buf), p); + e = apr_bucket_pool_create(buf, strlen(buf), p, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, e); if ( conf->preserve_host == 0 ) { if (uri->port_str && uri->port != DEFAULT_HTTP_PORT) { @@ -468,7 +470,7 @@ apr_status_t ap_proxy_http_request(apr_pool_t *p, request_rec *r, } buf = apr_pstrcat(p, "Host: ", hostname, CRLF, NULL); } - e = apr_bucket_pool_create(buf, strlen(buf), p); + e = apr_bucket_pool_create(buf, strlen(buf), p, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, e); /* handle Via */ @@ -583,14 +585,14 @@ apr_status_t ap_proxy_http_request(apr_pool_t *p, request_rec *r, buf = apr_pstrcat(p, headers_in[counter].key, ": ", headers_in[counter].val, CRLF, NULL); - e = apr_bucket_pool_create(buf, strlen(buf), p); + e = apr_bucket_pool_create(buf, strlen(buf), p, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, e); } /* add empty line at the end of the headers */ - e = apr_bucket_immortal_create(CRLF, sizeof(CRLF)-1); + e = apr_bucket_immortal_create(CRLF, sizeof(CRLF)-1, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, e); - e = apr_bucket_flush_create(); + e = apr_bucket_flush_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, e); ap_pass_brigade(origin->output_filters, bb); @@ -598,9 +600,9 @@ apr_status_t ap_proxy_http_request(apr_pool_t *p, request_rec *r, /* send the request data, if any. */ if (ap_should_client_block(r)) { while ((counter = ap_get_client_block(r, buffer, sizeof(buffer))) > 0) { - e = apr_bucket_pool_create(buffer, counter, p); + e = apr_bucket_pool_create(buffer, counter, p, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, e); - e = apr_bucket_flush_create(); + e = apr_bucket_flush_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, e); ap_pass_brigade(origin->output_filters, bb); apr_brigade_cleanup(bb); @@ -617,6 +619,7 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r, proxy_server_conf *conf, apr_bucket_brigade *bb, char *server_portstr) { + conn_rec *c = r->connection; char buffer[HUGE_STRING_LEN]; request_rec *rp; apr_bucket *e; @@ -789,7 +792,7 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r, /* Is it an HTTP/0.9 response? If so, send the extra data */ if (backasswards) { apr_ssize_t cntr = len; - e = apr_bucket_heap_create(buffer, cntr, 1); + e = apr_bucket_heap_create(buffer, cntr, NULL, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, e); } @@ -859,7 +862,7 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r, /* if no EOS yet, then we must flush */ if (FALSE == finish) { - e = apr_bucket_flush_create(); + e = apr_bucket_flush_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, e); } @@ -958,7 +961,7 @@ int ap_proxy_http_handler(request_rec *r, proxy_server_conf *conf, */ apr_pool_t *p = r->connection->pool; conn_rec *c = r->connection; - apr_bucket_brigade *bb = apr_brigade_create(p); + apr_bucket_brigade *bb = apr_brigade_create(p, c->bucket_alloc); apr_uri_t *uri = apr_palloc(r->connection->pool, sizeof(*uri)); proxy_http_conn_t *p_conn = apr_pcalloc(r->connection->pool, sizeof(*p_conn)); diff --git a/modules/ssl/ssl_engine_io.c b/modules/ssl/ssl_engine_io.c index b059c312c3..1c14f1f33c 100644 --- a/modules/ssl/ssl_engine_io.c +++ b/modules/ssl/ssl_engine_io.c @@ -99,7 +99,7 @@ static BIO_bucket_t *BIO_bucket_new(SSLFilterRec *frec, conn_rec *c) b->frec = frec; b->c = c; - b->bb = apr_brigade_create(c->pool); + b->bb = apr_brigade_create(c->pool, c->bucket_alloc); b->blen = 0; b->length = 0; @@ -111,24 +111,25 @@ static BIO_bucket_t *BIO_bucket_new(SSLFilterRec *frec, conn_rec *c) static int BIO_bucket_flush(BIO *bio) { BIO_bucket_t *b = BIO_bucket_ptr(bio); + apr_bucket *e; if (!(b->blen || b->length)) { return APR_SUCCESS; } if (b->blen) { - apr_bucket *bucket = - apr_bucket_transient_create(b->buffer, - b->blen); + e = apr_bucket_transient_create(b->buffer, b->blen, + b->bb->bucket_alloc); /* we filled this buffer first so add it to the * head of the brigade */ - APR_BRIGADE_INSERT_HEAD(b->bb, bucket); + APR_BRIGADE_INSERT_HEAD(b->bb, e); b->blen = 0; } b->length = 0; - APR_BRIGADE_INSERT_TAIL(b->bb, apr_bucket_flush_create()); + e = apr_bucket_flush_create(b->bb->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(b->bb, e); return ap_pass_brigade(b->frec->pOutputFilter->next, b->bb); } @@ -187,7 +188,8 @@ static int bio_bucket_write(BIO *bio, const char *in, int inl) * need to flush since we're using SSL's malloc-ed buffer * which will be overwritten once we leave here */ - apr_bucket *bucket = apr_bucket_transient_create(in, inl); + apr_bucket *bucket = apr_bucket_transient_create(in, inl, + b->bb->bucket_alloc); b->length += inl; APR_BRIGADE_INSERT_TAIL(b->bb, bucket); @@ -732,9 +734,10 @@ static apr_status_t ssl_io_input_getline(ssl_io_input_ctx_t *ctx, #define HTTP_ON_HTTPS_PORT \ "GET /mod_ssl:error:HTTP-request HTTP/1.0\r\n\r\n" -#define HTTP_ON_HTTPS_PORT_BUCKET() \ +#define HTTP_ON_HTTPS_PORT_BUCKET(alloc) \ apr_bucket_immortal_create(HTTP_ON_HTTPS_PORT, \ - sizeof(HTTP_ON_HTTPS_PORT) - 1) + sizeof(HTTP_ON_HTTPS_PORT) - 1, \ + alloc) static apr_status_t ssl_io_filter_error(ap_filter_t *f, apr_bucket_brigade *bb, @@ -750,7 +753,7 @@ static apr_status_t ssl_io_filter_error(ap_filter_t *f, "trying to send HTML error page"); /* fake the request line */ - bucket = HTTP_ON_HTTPS_PORT_BUCKET(); + bucket = HTTP_ON_HTTPS_PORT_BUCKET(f->c->bucket_alloc); break; default: @@ -824,7 +827,7 @@ static apr_status_t ssl_io_filter_Input(ap_filter_t *f, if (len > 0) { apr_bucket *bucket = - apr_bucket_transient_create(ctx->buffer, len); + apr_bucket_transient_create(ctx->buffer, len, f->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, bucket); } @@ -847,7 +850,7 @@ static void ssl_io_input_add_filter(SSLFilterRec *frec, conn_rec *c, ctx->inbio.ssl = ssl; ctx->inbio.wbio = frec->pbioWrite; ctx->inbio.f = frec->pInputFilter; - ctx->inbio.bb = apr_brigade_create(c->pool); + ctx->inbio.bb = apr_brigade_create(c->pool, c->bucket_alloc); ctx->inbio.bucket = NULL; ctx->inbio.cbuf.length = 0; diff --git a/modules/test/mod_bucketeer.c b/modules/test/mod_bucketeer.c index c601cceb18..c3a58d840c 100644 --- a/modules/test/mod_bucketeer.c +++ b/modules/test/mod_bucketeer.c @@ -122,7 +122,7 @@ static apr_status_t bucketeer_out_filter(ap_filter_t *f, /* We're cool with filtering this. */ ctx = f->ctx = apr_pcalloc(f->r->pool, sizeof(*ctx)); - ctx->bb = apr_brigade_create(f->r->pool); + ctx->bb = apr_brigade_create(f->r->pool, f->c->bucket_alloc); apr_table_unset(f->r->headers_out, "Content-Length"); } @@ -163,13 +163,13 @@ static apr_status_t bucketeer_out_filter(ap_filter_t *f, p = apr_bucket_pool_create(apr_pmemdup( f->r->pool, &data[lastpos], i-lastpos), - i-lastpos, - f->r->pool); + i-lastpos, f->r->pool, + f->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(ctx->bb,p); } lastpos=i+1; if ( data[i] == c->flushdelimiter) { - p = apr_bucket_flush_create(); + p = apr_bucket_flush_create(f->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(ctx->bb,p); } if ( data[i] == c->flushdelimiter || data[i] == c->passdelimiter ) { @@ -181,7 +181,11 @@ static apr_status_t bucketeer_out_filter(ap_filter_t *f, /* XXX: really should append this to the next 'real' bucket */ if ( lastpos < i ) { apr_bucket *p; - p = apr_bucket_pool_create(apr_pmemdup( f->r->pool,&data[lastpos],i-lastpos),i-lastpos,f->r->pool); + p = apr_bucket_pool_create(apr_pmemdup(f->r->pool, + &data[lastpos], + i-lastpos), + i-lastpos, f->r->pool, + f->c->bucket_alloc); lastpos=i; APR_BRIGADE_INSERT_TAIL(ctx->bb,p); } diff --git a/server/connection.c b/server/connection.c index 840f592da1..e84d88a8da 100644 --- a/server/connection.c +++ b/server/connection.c @@ -80,8 +80,8 @@ APR_HOOK_STRUCT( APR_HOOK_LINK(pre_connection) ) AP_IMPLEMENT_HOOK_RUN_FIRST(conn_rec *,create_connection, - (apr_pool_t *p, server_rec *server, apr_socket_t *csd, long conn_id, void *sbh), - (p, server, csd, conn_id, sbh), NULL) + (apr_pool_t *p, server_rec *server, apr_socket_t *csd, long conn_id, void *sbh, apr_bucket_alloc_t *alloc), + (p, server, csd, conn_id, sbh, alloc), NULL) AP_IMPLEMENT_HOOK_RUN_FIRST(int,process_connection,(conn_rec *c),(c),DECLINED) AP_IMPLEMENT_HOOK_RUN_ALL(int,pre_connection,(conn_rec *c, void *csd),(c, csd),OK,DECLINED) /* @@ -113,8 +113,8 @@ AP_CORE_DECLARE(void) ap_flush_conn(conn_rec *c) apr_bucket_brigade *bb; apr_bucket *b; - bb = apr_brigade_create(c->pool); - b = apr_bucket_flush_create(); + bb = apr_brigade_create(c->pool, c->bucket_alloc); + b = apr_bucket_flush_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); ap_pass_brigade(c->output_filters, bb); } diff --git a/server/core.c b/server/core.c index 99cc8d8900..dca2ffd57a 100644 --- a/server/core.c +++ b/server/core.c @@ -3122,6 +3122,7 @@ static int core_override_type(request_rec *r) static int default_handler(request_rec *r) { + conn_rec *c = r->connection; apr_bucket_brigade *bb; apr_bucket *e; core_dir_config *d; @@ -3215,7 +3216,7 @@ static int default_handler(request_rec *r) ap_md5digest(r->pool, fd)); } - bb = apr_brigade_create(r->pool); + bb = apr_brigade_create(r->pool, c->bucket_alloc); #if APR_HAS_LARGE_FILES if (r->finfo.size > AP_MAX_SENDFILE) { /* APR_HAS_LARGE_FILES issue; must split into mutiple buckets, @@ -3223,7 +3224,8 @@ static int default_handler(request_rec *r) * in case the brigade code/filters attempt to read it directly. */ apr_off_t fsize = r->finfo.size; - e = apr_bucket_file_create(fd, 0, AP_MAX_SENDFILE, r->pool); + e = apr_bucket_file_create(fd, 0, AP_MAX_SENDFILE, r->pool, + c->bucket_alloc); while (fsize > AP_MAX_SENDFILE) { apr_bucket *ce; apr_bucket_copy(e, &ce); @@ -3235,10 +3237,11 @@ static int default_handler(request_rec *r) } else #endif - e = apr_bucket_file_create(fd, 0, (apr_size_t)r->finfo.size, r->pool); + e = apr_bucket_file_create(fd, 0, (apr_size_t)r->finfo.size, + r->pool, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, e); - e = apr_bucket_eos_create(); + e = apr_bucket_eos_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, e); return ap_pass_brigade(r->output_filters, bb); @@ -3320,10 +3323,10 @@ static int core_input_filter(ap_filter_t *f, apr_bucket_brigade *b, if (!ctx) { ctx = apr_pcalloc(f->c->pool, sizeof(*ctx)); - ctx->b = apr_brigade_create(f->c->pool); + ctx->b = apr_brigade_create(f->c->pool, f->c->bucket_alloc); /* seed the brigade with the client socket. */ - e = apr_bucket_socket_create(net->client_socket); + e = apr_bucket_socket_create(net->client_socket, f->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(ctx->b, e); net->in_ctx = ctx; } @@ -3410,7 +3413,7 @@ static int core_input_filter(ap_filter_t *f, apr_bucket_brigade *b, * so tack on an EOS too. */ /* We have read until the brigade was empty, so we know that we * must be EOS. */ - e = apr_bucket_eos_create(); + e = apr_bucket_eos_create(f->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(b, e); return APR_SUCCESS; } @@ -3444,7 +3447,7 @@ static int core_input_filter(ap_filter_t *f, apr_bucket_brigade *b, apr_bucket_delete(e); if (mode == AP_MODE_READBYTES) { - e = apr_bucket_eos_create(); + e = apr_bucket_eos_create(f->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(b, e); } return APR_SUCCESS; @@ -3618,7 +3621,8 @@ static apr_status_t core_output_filter(ap_filter_t *f, apr_bucket_brigade *b) b = bb; } else { - temp_brig = apr_brigade_create(f->c->pool); + temp_brig = apr_brigade_create(f->c->pool, + f->c->bucket_alloc); } temp = APR_BRIGADE_FIRST(b); @@ -3722,7 +3726,8 @@ static apr_status_t core_output_filter(ap_filter_t *f, apr_bucket_brigade *b) * after the request_pool is cleared. */ if (ctx->b == NULL) { - ctx->b = apr_brigade_create(net->c->pool); + ctx->b = apr_brigade_create(net->c->pool, + net->c->bucket_alloc); } APR_BRIGADE_FOREACH(bucket, b) { @@ -3925,7 +3930,7 @@ static int core_create_req(request_rec *r) req_cfg->bb = main_req_cfg->bb; } else { - req_cfg->bb = apr_brigade_create(r->pool); + req_cfg->bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); if (!r->prev) { ap_add_input_filter_handle(ap_net_time_filter_handle, NULL, r, r->connection); @@ -3948,7 +3953,8 @@ static int core_create_proxy_req(request_rec *r, request_rec *pr) } static conn_rec *core_create_conn(apr_pool_t *ptrans, server_rec *server, - apr_socket_t *csd, long id, void *sbh) + apr_socket_t *csd, long id, void *sbh, + apr_bucket_alloc_t *alloc) { apr_status_t rv; conn_rec *c = (conn_rec *) apr_pcalloc(ptrans, sizeof(conn_rec)); @@ -3984,6 +3990,8 @@ static conn_rec *core_create_conn(apr_pool_t *ptrans, server_rec *server, c->base_server = server; c->id = id; + c->bucket_alloc = alloc; + return c; } diff --git a/server/error_bucket.c b/server/error_bucket.c index cfacbd86aa..57ad7e4b22 100644 --- a/server/error_bucket.c +++ b/server/error_bucket.c @@ -55,7 +55,6 @@ #include "http_protocol.h" #include "apr_buckets.h" #include "apr_strings.h" -#include #if APR_HAVE_STRINGS_H #include #endif @@ -73,10 +72,7 @@ AP_DECLARE(apr_bucket *) ap_bucket_error_make(apr_bucket *b, int error, { ap_bucket_error *h; - h = malloc(sizeof(*h)); - if (h == NULL) { - return NULL; - } + h = apr_bucket_alloc(sizeof(*h), b->list); h->status = error; h->data = (buf) ? apr_pstrdup(p, buf) : NULL; @@ -87,19 +83,21 @@ AP_DECLARE(apr_bucket *) ap_bucket_error_make(apr_bucket *b, int error, return b; } -AP_DECLARE(apr_bucket *) ap_bucket_error_create(int error, - const char *buf, apr_pool_t *p) +AP_DECLARE(apr_bucket *) ap_bucket_error_create(int error, const char *buf, + apr_pool_t *p, + apr_bucket_alloc_t *list) { - apr_bucket *b = (apr_bucket *)malloc(sizeof(*b)); + apr_bucket *b = apr_bucket_alloc(sizeof(*b), list); APR_BUCKET_INIT(b); - b->free = free; + b->free = apr_bucket_free; + b->list = list; return ap_bucket_error_make(b, error, buf, p); } AP_DECLARE_DATA const apr_bucket_type_t ap_bucket_type_error = { "ERROR", 5, - free, + apr_bucket_free, error_read, apr_bucket_setaside_notimpl, apr_bucket_split_notimpl, diff --git a/server/mpm/beos/beos.c b/server/mpm/beos/beos.c index a965702137..9df32c06e3 100644 --- a/server/mpm/beos/beos.c +++ b/server/mpm/beos/beos.c @@ -324,7 +324,8 @@ int ap_graceful_stop_signalled(void) * Child process main loop. */ -static void process_socket(apr_pool_t *p, apr_socket_t *sock, int my_child_num) +static void process_socket(apr_pool_t *p, apr_socket_t *sock, + int my_child_num, apr_bucket_alloc_t *bucket_alloc) { conn_rec *current_conn; long conn_id = my_child_num; @@ -359,6 +360,7 @@ static int32 worker_thread(void * dummy) apr_allocator_t *allocator; apr_socket_t *csd = NULL; apr_pool_t *ptrans; /* Pool for per-transaction stuff */ + apr_bucket_alloc_t *bucket_alloc; apr_socket_t *sd = NULL; apr_status_t rv = APR_EINIT; int srv , n; @@ -393,6 +395,8 @@ static int32 worker_thread(void * dummy) for(n=0 ; n <= num_listening_sockets ; n++) apr_poll_socket_add(pollset, listening_sockets[n], APR_POLLIN); + bucket_alloc = apr_bucket_alloc_create(tpool); + while (1) { /* If we're here, then chances are (unless we're the first thread created) * we're going to be held up in the accept mutex, so doing this here @@ -480,7 +484,7 @@ static int32 worker_thread(void * dummy) ap_log_error(APLOG_MARK, APLOG_ERR, rv, ap_server_conf, "apr_accept"); } else { - process_socket(ptrans, csd, child_slot); + process_socket(ptrans, csd, child_slot, bucket_alloc); requests_this_child--; } } @@ -493,6 +497,8 @@ static int32 worker_thread(void * dummy) ap_update_child_status_from_indexes(0, child_slot, SERVER_DEAD, (request_rec*)NULL); + apr_bucket_alloc_destroy(bucket_alloc); + ap_log_error(APLOG_MARK, APLOG_NOTICE | APLOG_NOERRNO, 0, NULL, "worker_thread %ld exiting", find_thread(NULL)); diff --git a/server/mpm/experimental/perchild/perchild.c b/server/mpm/experimental/perchild/perchild.c index 0cd8644859..5a1128ceeb 100644 --- a/server/mpm/experimental/perchild/perchild.c +++ b/server/mpm/experimental/perchild/perchild.c @@ -1540,19 +1540,19 @@ static int pass_request(request_rec *r) struct cmsghdr *cmsg; int sfd; struct iovec iov; - apr_bucket_brigade *bb = apr_brigade_create(r->pool); + conn_rec *c = r->connection; + apr_bucket_brigade *bb = apr_brigade_create(r->pool, c->bucket_alloc); perchild_server_conf *sconf = (perchild_server_conf *) ap_get_module_config(r->server->module_config, &mpm_perchild_module); char *foo; apr_size_t len; - apr_pool_userdata_get((void **)&foo, "PERCHILD_BUFFER", - r->connection->pool); + apr_pool_userdata_get((void **)&foo, "PERCHILD_BUFFER", c->pool); len = strlen(foo); apr_pool_userdata_set(NULL, "PERCHILD_BUFFER", apr_pool_cleanup_null, - r->connection->pool); + c->pool); apr_os_sock_get(&sfd, thesock); diff --git a/server/mpm/mpmt_os2/mpmt_os2_child.c b/server/mpm/mpmt_os2/mpmt_os2_child.c index 35c8661de7..f9d7f1cdd5 100644 --- a/server/mpm/mpmt_os2/mpmt_os2_child.c +++ b/server/mpm/mpmt_os2/mpmt_os2_child.c @@ -400,6 +400,7 @@ static void worker_main(void *vpArg) long conn_id; conn_rec *current_conn; apr_pool_t *pconn; + apr_bucket_alloc_t *bucket_alloc; worker_args_t *worker_args; HQUEUE workq; PID owner; @@ -430,14 +431,18 @@ static void worker_main(void *vpArg) while (rc = DosReadQueue(workq, &rd, &len, (PPVOID)&worker_args, 0, DCWW_WAIT, &priority, NULLHANDLE), rc == 0 && rd.ulData != WORKTYPE_EXIT) { pconn = worker_args->pconn; + bucket_alloc = apr_bucket_alloc_create(pconn); ap_create_sb_handle(&sbh, pconn, child_slot, thread_slot); - current_conn = ap_run_create_connection(pconn, ap_server_conf, worker_args->conn_sd, conn_id, sbh); + current_conn = ap_run_create_connection(pconn, ap_server_conf, + worker_args->conn_sd, conn_id, + sbh, bucket_alloc); if (current_conn) { ap_process_connection(current_conn, worker_args->conn_sd); ap_lingering_close(current_conn); } + apr_bucket_alloc_destroy(bucket_alloc); apr_pool_destroy(pconn); ap_update_child_status_from_indexes(child_slot, thread_slot, SERVER_READY, NULL); diff --git a/server/mpm/netware/mpm_netware.c b/server/mpm/netware/mpm_netware.c index a84d0801c8..6a284c895e 100644 --- a/server/mpm/netware/mpm_netware.c +++ b/server/mpm/netware/mpm_netware.c @@ -353,6 +353,7 @@ void worker_main(void *arg) ap_listen_rec *last_lr = NULL; apr_pool_t *ptrans; apr_allocator_t *allocator; + apr_bucket_alloc_t *bucket_alloc; conn_rec *current_conn; apr_status_t stat = APR_EINIT; int worker_num_arg = (int)arg; @@ -374,6 +375,8 @@ void worker_main(void *arg) apr_pool_create_ex(&ptrans, NULL, NULL, allocator); apr_allocator_set_owner(allocator, ptrans); + bucket_alloc = apr_bucket_alloc_create(ptrans); + apr_pool_tag(ptrans, "transaction"); apr_thread_mutex_lock(worker_thread_count_mutex); @@ -533,7 +536,8 @@ got_listener: * socket options, file descriptors, and read/write buffers. */ current_conn = ap_run_create_connection(ptrans, ap_server_conf, csd, - my_worker_num, sbh); + my_worker_num, sbh, + bucket_alloc); if (current_conn) { ap_process_connection(current_conn, csd); ap_lingering_close(current_conn); diff --git a/server/mpm/perchild/perchild.c b/server/mpm/perchild/perchild.c index 0cd8644859..5a1128ceeb 100644 --- a/server/mpm/perchild/perchild.c +++ b/server/mpm/perchild/perchild.c @@ -1540,19 +1540,19 @@ static int pass_request(request_rec *r) struct cmsghdr *cmsg; int sfd; struct iovec iov; - apr_bucket_brigade *bb = apr_brigade_create(r->pool); + conn_rec *c = r->connection; + apr_bucket_brigade *bb = apr_brigade_create(r->pool, c->bucket_alloc); perchild_server_conf *sconf = (perchild_server_conf *) ap_get_module_config(r->server->module_config, &mpm_perchild_module); char *foo; apr_size_t len; - apr_pool_userdata_get((void **)&foo, "PERCHILD_BUFFER", - r->connection->pool); + apr_pool_userdata_get((void **)&foo, "PERCHILD_BUFFER", c->pool); len = strlen(foo); apr_pool_userdata_set(NULL, "PERCHILD_BUFFER", apr_pool_cleanup_null, - r->connection->pool); + c->pool); apr_os_sock_get(&sfd, thesock); diff --git a/server/mpm/prefork/prefork.c b/server/mpm/prefork/prefork.c index f48176d0e8..12c9ae6260 100644 --- a/server/mpm/prefork/prefork.c +++ b/server/mpm/prefork/prefork.c @@ -527,6 +527,7 @@ static void child_main(int child_num_arg) void *csd; ap_sb_handle_t *sbh; apr_status_t rv; + apr_bucket_alloc_t *bucket_alloc; my_child_num = child_num_arg; ap_my_pid = getpid(); @@ -576,6 +577,8 @@ static void child_main(int child_num_arg) for (i = 0; i < num_listensocks; i++) apr_poll_socket_add(pollset, listensocks[i].sd, APR_POLLIN); + bucket_alloc = apr_bucket_alloc_create(pchild); + while (!die_now) { /* * (Re)initialize this child to a pre-connection state. @@ -667,7 +670,7 @@ static void child_main(int child_num_arg) * socket options, file descriptors, and read/write buffers. */ - current_conn = ap_run_create_connection(ptrans, ap_server_conf, csd, my_child_num, sbh); + current_conn = ap_run_create_connection(ptrans, ap_server_conf, csd, my_child_num, sbh, bucket_alloc); if (current_conn) { ap_process_connection(current_conn, csd); ap_lingering_close(current_conn); diff --git a/server/mpm/winnt/mpm_winnt.c b/server/mpm/winnt/mpm_winnt.c index b1ed742803..27996be64b 100644 --- a/server/mpm/winnt/mpm_winnt.c +++ b/server/mpm/winnt/mpm_winnt.c @@ -1052,6 +1052,7 @@ static void worker_main(long thread_num) { static int requests_this_child = 0; PCOMP_CONTEXT context = NULL; + apr_bucket_alloc_t *bucket_alloc; apr_os_sock_info_t sockinfo; ap_sb_handle_t *sbh; @@ -1075,6 +1076,9 @@ static void worker_main(long thread_num) break; } + /* XXX: where does this go? */ + bucket_alloc = apr_bucket_alloc_create(context->ptrans); + /* Have we hit MaxRequestPerChild connections? */ if (ap_max_requests_per_child) { requests_this_child++; @@ -1092,8 +1096,9 @@ static void worker_main(long thread_num) apr_os_sock_make(&context->sock, &sockinfo, context->ptrans); ap_create_sb_handle(&sbh, context->ptrans, 0, thread_num); - c = ap_run_create_connection(context->ptrans, ap_server_conf, context->sock, - thread_num, sbh); + c = ap_run_create_connection(context->ptrans, ap_server_conf, + context->sock, thread_num, sbh, + bucket_alloc); if (c) { ap_process_connection(c, context->sock); diff --git a/server/mpm/worker/worker.c b/server/mpm/worker/worker.c index 474a1e2964..b871af575e 100644 --- a/server/mpm/worker/worker.c +++ b/server/mpm/worker/worker.c @@ -575,7 +575,7 @@ int ap_graceful_stop_signalled(void) */ static void process_socket(apr_pool_t *p, apr_socket_t *sock, int my_child_num, - int my_thread_num) + int my_thread_num, apr_bucket_alloc_t *bucket_alloc) { conn_rec *current_conn; long conn_id = ID_FROM_CHILD_THREAD(my_child_num, my_thread_num); @@ -595,7 +595,8 @@ static void process_socket(apr_pool_t *p, apr_socket_t *sock, int my_child_num, return; } - current_conn = ap_run_create_connection(p, ap_server_conf, sock, conn_id, sbh); + current_conn = ap_run_create_connection(p, ap_server_conf, sock, + conn_id, sbh, bucket_alloc); if (current_conn) { ap_process_connection(current_conn, sock); ap_lingering_close(current_conn); @@ -834,6 +835,7 @@ static void * APR_THREAD_FUNC worker_thread(apr_thread_t *thd, void * dummy) int process_slot = ti->pid; int thread_slot = ti->tid; apr_socket_t *csd = NULL; + apr_bucket_alloc_t *bucket_alloc; apr_pool_t *last_ptrans = NULL; apr_pool_t *ptrans; /* Pool for per-transaction stuff */ apr_status_t rv; @@ -841,6 +843,9 @@ static void * APR_THREAD_FUNC worker_thread(apr_thread_t *thd, void * dummy) free(ti); ap_update_child_status_from_indexes(process_slot, thread_slot, SERVER_STARTING, NULL); + + bucket_alloc = apr_bucket_alloc_create(apr_thread_pool_get(thd)); + while (!workers_may_exit) { ap_update_child_status_from_indexes(process_slot, thread_slot, SERVER_READY, NULL); rv = ap_queue_pop(worker_queue, &csd, &ptrans, last_ptrans); @@ -870,7 +875,7 @@ static void * APR_THREAD_FUNC worker_thread(apr_thread_t *thd, void * dummy) } continue; } - process_socket(ptrans, csd, process_slot, thread_slot); + process_socket(ptrans, csd, process_slot, thread_slot, bucket_alloc); requests_this_child--; /* FIXME: should be synchronized - aaron */ apr_pool_clear(ptrans); last_ptrans = ptrans; @@ -879,6 +884,8 @@ static void * APR_THREAD_FUNC worker_thread(apr_thread_t *thd, void * dummy) ap_update_child_status_from_indexes(process_slot, thread_slot, (dying) ? SERVER_DEAD : SERVER_GRACEFUL, (request_rec *) NULL); + apr_bucket_alloc_destroy(bucket_alloc); + apr_thread_exit(thd, APR_SUCCESS); return NULL; } diff --git a/server/protocol.c b/server/protocol.c index a8c2e725e2..1304a230c0 100644 --- a/server/protocol.c +++ b/server/protocol.c @@ -217,7 +217,7 @@ AP_DECLARE(apr_status_t) ap_rgetline_core(char **s, apr_size_t n, char *pos, *last_char = *s; int do_alloc = (*s == NULL), saw_eos = 0; - b = apr_brigade_create(r->pool); + b = apr_brigade_create(r->pool, r->connection->bucket_alloc); rv = ap_get_brigade(r->input_filters, b, AP_MODE_GETLINE, APR_BLOCK_READ, 0); @@ -405,7 +405,7 @@ AP_DECLARE(apr_status_t) ap_rgetline_core(char **s, apr_size_t n, char c; /* Create a brigade for this filter read. */ - bb = apr_brigade_create(r->pool); + bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); /* We only care about the first byte. */ rv = ap_get_brigade(r->input_filters, bb, AP_MODE_SPECULATIVE, @@ -984,11 +984,12 @@ void ap_set_sub_req_protocol(request_rec *rnew, const request_rec *r) static void end_output_stream(request_rec *r) { + conn_rec *c = r->connection; apr_bucket_brigade *bb; apr_bucket *b; - bb = apr_brigade_create(r->pool); - b = apr_bucket_eos_create(); + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_eos_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); ap_pass_brigade(r->output_filters, bb); } @@ -1269,12 +1270,13 @@ AP_DECLARE(apr_status_t) ap_send_fd(apr_file_t *fd, request_rec *r, apr_off_t offset, apr_size_t len, apr_size_t *nbytes) { + conn_rec *c = r->connection; apr_bucket_brigade *bb = NULL; apr_bucket *b; apr_status_t rv; - bb = apr_brigade_create(r->pool); - b = apr_bucket_file_create(fd, offset, len, r->pool); + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_file_create(fd, offset, len, r->pool, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); rv = ap_pass_brigade(r->output_filters, bb); @@ -1293,11 +1295,12 @@ AP_DECLARE(apr_status_t) ap_send_fd(apr_file_t *fd, request_rec *r, AP_DECLARE(size_t) ap_send_mmap(apr_mmap_t *mm, request_rec *r, size_t offset, size_t length) { + conn_rec *c = r->connection; apr_bucket_brigade *bb = NULL; apr_bucket *b; - bb = apr_brigade_create(r->pool); - b = apr_bucket_mmap_create(mm, offset, length); + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_mmap_create(mm, offset, length, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); ap_pass_brigade(r->output_filters, bb); @@ -1332,6 +1335,7 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_old_write_filter( static apr_status_t buffer_output(request_rec *r, const char *str, apr_size_t len) { + conn_rec *c = r->connection; ap_filter_t *f; old_write_filter_ctx *ctx; @@ -1359,8 +1363,8 @@ static apr_status_t buffer_output(request_rec *r, * deliver the content through the normal filter chain */ if (f != r->output_filters) { - apr_bucket_brigade *bb = apr_brigade_create(r->pool); - apr_bucket *b = apr_bucket_transient_create(str, len); + apr_bucket_brigade *bb = apr_brigade_create(r->pool, c->bucket_alloc); + apr_bucket *b = apr_bucket_transient_create(str, len, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); return ap_pass_brigade(r->output_filters, bb); @@ -1370,7 +1374,7 @@ static apr_status_t buffer_output(request_rec *r, ctx = r->output_filters->ctx; if (ctx->bb == NULL) { - ctx->bb = apr_brigade_create(r->pool); + ctx->bb = apr_brigade_create(r->pool, c->bucket_alloc); } return ap_fwrite(f->next, ctx->bb, str, len); @@ -1525,11 +1529,12 @@ AP_DECLARE_NONSTD(int) ap_rvputs(request_rec *r, ...) AP_DECLARE(int) ap_rflush(request_rec *r) { + conn_rec *c = r->connection; apr_bucket_brigade *bb; apr_bucket *b; - bb = apr_brigade_create(r->pool); - b = apr_bucket_flush_create(); + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_flush_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); if (ap_pass_brigade(r->output_filters, bb) != APR_SUCCESS) return -1; diff --git a/server/util_filter.c b/server/util_filter.c index 919e5a2f3f..adb4a46a67 100644 --- a/server/util_filter.c +++ b/server/util_filter.c @@ -547,7 +547,7 @@ AP_DECLARE(apr_status_t) ap_save_brigade(ap_filter_t *f, * create an empty bucket brigade so that we can concat. */ if (!(*saveto)) { - *saveto = apr_brigade_create(p); + *saveto = apr_brigade_create(p, f->c->bucket_alloc); } APR_RING_FOREACH(e, &(*b)->list, apr_bucket, link) { @@ -575,7 +575,7 @@ AP_DECLARE(apr_status_t) ap_fflush(ap_filter_t *f, apr_bucket_brigade *bb) { apr_bucket *b; - b = apr_bucket_flush_create(); + b = apr_bucket_flush_create(f->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b); return ap_pass_brigade(f, bb); }