]> granicus.if.org Git - apache/commitdiff
BUCKET FREELISTS
authorCliff Woolley <jwoolley@apache.org>
Fri, 29 Mar 2002 08:17:26 +0000 (08:17 +0000)
committerCliff Woolley <jwoolley@apache.org>
Fri, 29 Mar 2002 08:17:26 +0000 (08:17 +0000)
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

44 files changed:
CHANGES
STATUS
include/ap_mmn.h
include/http_connection.h
include/http_protocol.h
include/httpd.h
modules/arch/win32/mod_isapi.c
modules/cache/mod_file_cache.c
modules/dav/fs/repos.c
modules/echo/mod_echo.c
modules/experimental/mod_cache.c
modules/experimental/mod_case_filter.c
modules/experimental/mod_case_filter_in.c
modules/experimental/mod_charset_lite.c
modules/experimental/mod_deflate.c
modules/experimental/mod_disk_cache.c
modules/experimental/mod_ext_filter.c
modules/experimental/mod_mem_cache.c
modules/filters/mod_include.c
modules/filters/mod_include.h
modules/generators/mod_asis.c
modules/generators/mod_cgi.c
modules/generators/mod_cgid.c
modules/http/http_core.c
modules/http/http_protocol.c
modules/http/http_request.c
modules/mappers/mod_negotiation.c
modules/proxy/proxy_ftp.c
modules/proxy/proxy_http.c
modules/ssl/ssl_engine_io.c
modules/test/mod_bucketeer.c
server/connection.c
server/core.c
server/error_bucket.c
server/mpm/beos/beos.c
server/mpm/experimental/perchild/perchild.c
server/mpm/mpmt_os2/mpmt_os2_child.c
server/mpm/netware/mpm_netware.c
server/mpm/perchild/perchild.c
server/mpm/prefork/prefork.c
server/mpm/winnt/mpm_winnt.c
server/mpm/worker/worker.c
server/protocol.c
server/util_filter.c

diff --git a/CHANGES b/CHANGES
index 92cb0e2e623664f1261dae1fbf3d94cad4d9e1ff..fbcf30c462e07e9f45222b2ca34a63937939309b 100644 (file)
--- 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
      <!--#echo--> and <!--#set--> directives [Brian Pane]
 
diff --git a/STATUS b/STATUS
index 2aecee2a515d9fb56ee5ece7171cff345041efd5..a07e6066321eb85117202f54ff2d721e8f3bb7d8 100644 (file)
--- 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
 
index b3344869e2bd843355914a510008058b0bdede85..4af558f9fa1e50fd2f9a20a719007d897b826a00 100644 (file)
  * 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 */
index a1b62f249643c4d5a94da0760d423e90ef63a607..85536ed65e235619943df5ee98f299956d45f2ab 100644 (file)
@@ -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
index 87f823830d80881c92cb9118c4e06a5950b980d0..5ad071fa8f2cf3a722cfb19f6976bc7437cece78 100644 (file)
@@ -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);
index 143f00f8a031690082b13b4999a09328b598b7b3..fc9abf12721ab73a416c6b57a1fc26e1608d5a30 100644 (file)
@@ -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... */
index 522082a7de7e965f97ebe0d7967bacdca0d0f3b3..c53d2d0b7e2608ee165bcfc21810133687a4dcf8 100644 (file)
@@ -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);
         }
index c1682b5c5e007ef2abac4475f23d1990248b42a8..c16d4bf724b78934f0f60c4081e95d3b5d428306 100644 (file)
@@ -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)
index 5846cdfbc715a0a22d196aa982f290fba0d9faa7..0333ea7da57ed77ba1602fd0b1cd51bc1085959e 100644 (file)
@@ -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 <stdio.h>              /* 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) {
index 42290124d623c32ae44cae0f1d7dff767c06e4e9..d7084e33753f488739aef76816390ad8ce71df32 100644 (file)
@@ -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);    
     }
index d05fca04dcd7db62878b64d063acbd82dd6eca22..6a5d5ca3c0fdac84f4f12595cc1de8683f1581f8 100644 (file)
@@ -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 "
index c19fa928a928f69dbebe0a2af8c0ba7eed0b8a52..ef7ee00fd2e7e36e9704bec2ab80842e3fc05fe8 100644 (file)
@@ -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);
        }
 
index 1bff66d8366a089b65e2bafb4f121f44e1cd2148..4d00261884f6cc15c55e3ffd8269323f3120bd7b 100644 (file)
@@ -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);
     }
index 7b99ddc33114601cd4498f9ff0a9f6ec69a7cbe1..a01e5d32c590cf545a65491cc41b96ada14347fe 100644 (file)
@@ -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
index 7744aee1f4f307a529fdd18545dd1d0d09c2e2e3..58ad7f69f349f02e99bebb45d1cedf3f8cd506e7 100644 (file)
@@ -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;
             }
index a06f84ded5d5954f0b91dff37dcaf607ddbffcc3..00e75e1a1a245d8e331b772f578b05814e2ac5e7 100644 (file)
@@ -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;
index 7d1f4f3488fa5613b78f9068c96e0fc500535f6e..f2e70d19629a0e93e813af116622a36a868451ed 100644 (file)
@@ -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;
         }
index d91ac17acb0deca0e3d679e85641c04b6b4a13ba..650dd7d4c278ce66dd27993339df05b71506cbb4 100644 (file)
@@ -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;
index c36bca0c998c358c93c660cded2fba6c609b849d..9eb279553d46baf9b0705493bca137a3b0cfc6c8 100644 (file)
@@ -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;
index bebf7f32b12907656fe6e03e44932e9ab184c539..bd7ff9161ea7997bf540c06e3784c695ca8bf3e8 100644 (file)
@@ -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;                                        \
index fff8e5cf849bf0d1066da7968a33675939b7e6ae..acad6697f61f592de68d484d97fb439e73917f96 100644 (file)
@@ -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) {
index 9470473dbd1b6583c211b7ed517798cd64cf92b5..2784359964635c03ef770d3850905caf96a75694 100644 (file)
@@ -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("<A HREF=\"",
-                                              sizeof("<A HREF=\"") - 1);
+                                              sizeof("<A HREF=\"") - 1,
+                                              c->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("</A>", sizeof("</A>") - 1);
+        tmp2_buck = apr_bucket_immortal_create("</A>", sizeof("</A>") - 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);
 
index 52994e03c31af7f650c0f37dfd6e165cef0e709c..a42f43b7792e68ec3c5984e2add9dc3e5c4aff35 100644 (file)
@@ -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("<A HREF=\"",
-                                              sizeof("<A HREF=\"") - 1);
+                                              sizeof("<A HREF=\"") - 1,
+                                              c->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("</A>", sizeof("</A>") - 1);
+        tmp2_buck = apr_bucket_immortal_create("</A>", sizeof("</A>") - 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);
     } 
index da9b045b5d13e0c3efed87ec9368b0a68a9eb505..61b15fa8afef83fa0a1a6c60ee02e534a7470800 100644 (file)
@@ -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 /* <trailers> */ ASCII_CRLF, 5);
+            e = apr_bucket_immortal_create(ASCII_ZERO ASCII_CRLF
+                                           /* <trailers> */
+                                           ASCII_CRLF, 5, c->bucket_alloc);
             APR_BUCKET_INSERT_BEFORE(eos, e);
         }
 
index 35ef816ed2e5faa5b668ec7ce3e7cb717dcf074d..c6a54b653d186502a4e35808cc9c8b10474d87e9 100644 (file)
@@ -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 */
index 36b1ceed125fab0f1e6780eea962258cf30b21e0..07e4de542cc6027d58eb8060b45b8e7a7e87e3c5 100644 (file)
@@ -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
index c0d870bfaf8949a5fa720db0995256900f282186..2e1a5a97a7fbcbaa08e88e9a2e9b6a6ade2d67ec 100644 (file)
@@ -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);
index b62492d94e63974f5b7a2efcb420cad289cba415..3e599e05713a4680a5f7406b4abb3c8df85a40ce 100644 (file)
@@ -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, "</h2>\n\n(%s)\n\n  <hr />\n\n<pre>",
                                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</pre>\n\n<hr />\n\n<pre>\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, "</pre>\n\n  <hr />\n\n  %s\n\n </body>\n</html>\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);
             }
 
index f37785d4ad7f32e1be56edd0b160121a7b23c167..0855114d4d655f226bc3f24d80a8c45ef334c17d 100644 (file)
@@ -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));
index b059c312c30140a39340dda7478a343826796324..1c14f1f33c739419199069bd13ccbc3553368ed2 100644 (file)
@@ -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;
 
index c601cceb184e78aeacf529b14c3761b655a851a2..c3a58d840c585a7ccd143debad891e23a3d49856 100644 (file)
@@ -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);
             }
index 840f592da198b261263a8d1d50f7372ffa4bdfe8..e84d88a8da8abf5e0bef0a8f93af4d16a85eceeb 100644 (file)
@@ -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);
 }
index 99cc8d89005613024de9cf1b8d3cdd9396167741..dca2ffd57a588e1bca305a7610db8c4225aaf5ea 100644 (file)
@@ -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;
 }
 
index cfacbd86aaf42b0c3e7e4d25854d749877621e7f..57ad7e4b22dd6ce30d5f3184549c70a8509f45c6 100644 (file)
@@ -55,7 +55,6 @@
 #include "http_protocol.h"
 #include "apr_buckets.h"
 #include "apr_strings.h"
-#include <stdlib.h>
 #if APR_HAVE_STRINGS_H
 #include <strings.h>
 #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,
index a9657021375d922eef8ccaee041de2e964f73d84..9df32c06e39f57440bae705923a79044b799e5ca 100644 (file)
@@ -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));
     
index 0cd864485953bd11df2e48da928edfd7ac713c8e..5a1128ceebf80112a3dee5c8bbf2bed5bf4c451d 100644 (file)
@@ -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);
 
index 35c8661de7b281d96ffb2c8a701c5c1d37b31ef5..f9d7f1cdd5aaac9e07b6051b9fb7b0f5073c0277 100644 (file)
@@ -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);
index a84d0801c899f5ebd343ebb1e1d8f4631b7cf331..6a284c895eb604cb335b2cdfaa6b0237f1f3f1ff 100644 (file)
@@ -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);
index 0cd864485953bd11df2e48da928edfd7ac713c8e..5a1128ceebf80112a3dee5c8bbf2bed5bf4c451d 100644 (file)
@@ -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);
 
index f48176d0e83fd0cf98909d4dea0692d0b6adb0de..12c9ae6260a861ae28a57e2be8535da9d52c594c 100644 (file)
@@ -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);
index b1ed742803b077bf3c09d61ffbc50ab5cc5fbed9..27996be64bb83f6f197e0ef3c6bea340d98f4ece 100644 (file)
@@ -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);
index 474a1e29649c9c69ef81b6b1beca2d088975a6b9..b871af575e8a0caa73ca15c473ec29dc41178fc0 100644 (file)
@@ -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;
 }
index a8c2e725e28507f8e7ad7a600efa310e91dd2209..1304a230c0569d45e6c0a01521133f9235e71002 100644 (file)
@@ -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;
index 919e5a2f3f9212e4849c1147d532bc944c16f66e..adb4a46a67b5d968f7d661173af6f47e9468faf8 100644 (file)
@@ -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);
 }