stas 2004/08/18 15:05:16
Modified: . Changes src/modules/perl modperl_filter.c modperl_types.h Log: replace the memory allocation for modperl filter handlers to use a temporary subpool of the ap_filter_t object. previously using perl's safemalloc had problems on win32 (randonly my_perl == NULL) Revision Changes Path 1.455 +4 -0 modperl-2.0/Changes Index: Changes =================================================================== RCS file: /home/cvs/modperl-2.0/Changes,v retrieving revision 1.454 retrieving revision 1.455 diff -u -u -r1.454 -r1.455 --- Changes 18 Aug 2004 18:05:29 -0000 1.454 +++ Changes 18 Aug 2004 22:05:16 -0000 1.455 @@ -12,6 +12,10 @@ =item 1.99_15-dev +replace the memory allocation for modperl filter handlers to use a +temporary subpool of the ap_filter_t object. previously using perl's +safemalloc had problems on win32 (randonly my_perl == NULL) [Stas] + Apache::Module remove_loaded_module re-added [Gozer] Disable Apache::HookRun::run_create_request -- it's already run 1.95 +27 -17 modperl-2.0/src/modules/perl/modperl_filter.c Index: modperl_filter.c =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_filter.c,v retrieving revision 1.94 retrieving revision 1.95 diff -u -u -r1.94 -r1.95 --- modperl_filter.c 10 Aug 2004 00:38:35 -0000 1.94 +++ modperl_filter.c 18 Aug 2004 22:05:16 -0000 1.95 @@ -38,21 +38,21 @@ /* allocate wbucket memory using malloc and not request pools, since * we may need many of these if the filter is invoked multiple * times */ -#define WBUCKET_INIT(wb, p, next_filter) \ - if (!wb) { \ - wb = (modperl_wbucket_t *)safemalloc(sizeof(*wb)); \ - wb->pool = p; \ - wb->filters = &next_filter; \ - wb->outcnt = 0; \ - wb->r = NULL; \ - wb->header_parse = 0; \ +#define WBUCKET_INIT(filter) \ + if (!filter->wbucket) { \ + modperl_wbucket_t *wb = \ + (modperl_wbucket_t *)apr_pcalloc(filter->temp_pool, \ + sizeof(*wb)); \ + wb->pool = filter->pool; \ + wb->filters = &(filter->f->next); \ + wb->outcnt = 0; \ + wb->r = NULL; \ + wb->header_parse = 0; \ + filter->wbucket = wb; \ } #define FILTER_FREE(filter) \ - if (filter->wbucket) { \ - safefree(filter->wbucket); \ - } \ - safefree(filter); + apr_pool_destroy(filter->temp_pool); /* Save the value of $@ if it was set */ #define MP_FILTER_SAVE_ERRSV(tmpsv) \ @@ -306,17 +306,26 @@ apr_off_t readbytes) { apr_pool_t *p = MP_FILTER_POOL(f); + apr_pool_t *temp_pool; modperl_filter_t *filter; /* we can't allocate memory from the pool here, since potentially * a filter can be called hundreds of times during the same * request/connection resulting in enormous memory demands - * (sizeof(*filter)*number of invocations) + * (sizeof(*filter)*number of invocations). so we use a sub-pool + * which will get destroyed at the end of each modperl_filter + * invocation. */ - Newz(0, filter, 1, modperl_filter_t); - + apr_status_t rv = apr_pool_create(&temp_pool, p); + if (rv != APR_SUCCESS) { + /* XXX: how do we handle the error? assert? */ + return NULL; + } + filter = (modperl_filter_t *)apr_pcalloc(temp_pool, sizeof(*filter)); + filter->mode = mode; filter->f = f; + filter->temp_pool = temp_pool; filter->pool = p; filter->wbucket = NULL; @@ -808,7 +817,7 @@ filter->flush = 0; } - WBUCKET_INIT(filter->wbucket, filter->pool, filter->f->next); + WBUCKET_INIT(filter); filter->rc = modperl_wbucket_flush(filter->wbucket, add_flush_bucket); if (filter->rc != APR_SUCCESS) { return filter->rc; @@ -848,7 +857,8 @@ const char *buf, apr_size_t *len) { - WBUCKET_INIT(filter->wbucket, filter->pool, filter->f->next); + WBUCKET_INIT(filter); + return modperl_wbucket_write(aTHX_ filter->wbucket, buf, len); } 1.76 +1 -0 modperl-2.0/src/modules/perl/modperl_types.h Index: modperl_types.h =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_types.h,v retrieving revision 1.75 retrieving revision 1.76 diff -u -u -r1.75 -r1.76 --- modperl_types.h 22 Jun 2004 22:34:10 -0000 1.75 +++ modperl_types.h 18 Aug 2004 22:05:16 -0000 1.76 @@ -228,6 +228,7 @@ apr_status_t rc; modperl_filter_mode_e mode; apr_pool_t *pool; + apr_pool_t *temp_pool; } modperl_filter_t; typedef struct {