stas 2003/12/13 15:40:31
Modified: src/modules/perl modperl_filter.c modperl_types.h
. Changes
Log:
Postpone the allocation of the wbucket in filters till the moment it's
needed (if at all). Since non-streaming filters aren't going to use
that buffer, it's a waste to allocate/free it.
Revision Changes Path
1.78 +27 -8 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.77
retrieving revision 1.78
diff -u -u -r1.77 -r1.78
--- modperl_filter.c 11 Dec 2003 07:38:41 -0000 1.77
+++ modperl_filter.c 13 Dec 2003 23:40:31 -0000 1.78
@@ -20,6 +20,25 @@
#define MP_FILTER_POOL(f) f->r ? f->r->pool : f->c->pool
+/* 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 FILTER_FREE(filter) \
+ if (filter->wbucket) { \
+ safefree(filter->wbucket); \
+ } \
+ safefree(filter);
+
/* this function is for tracing only, it's not optimized for performance */
static int is_modperl_filter(ap_filter_t *f)
{
@@ -264,9 +283,7 @@
filter->mode = mode;
filter->f = f;
filter->pool = p;
- filter->wbucket.pool = p;
- filter->wbucket.filters = &f->next;
- filter->wbucket.outcnt = 0;
+ filter->wbucket = NULL;
if (mode == MP_INPUT_FILTER_MODE) {
filter->bb_in = NULL;
@@ -393,7 +410,7 @@
status = modperl_errsv(aTHX_ status, r, s);
}
- safefree(filter);
+ FILTER_FREE(filter);
SvREFCNT_dec((SV*)args);
MP_INTERP_PUTBACK(interp);
@@ -739,7 +756,8 @@
filter->flush = 0;
}
- filter->rc = modperl_wbucket_flush(&filter->wbucket, add_flush_bucket);
+ WBUCKET_INIT(filter->wbucket, filter->pool, filter->f->next);
+ filter->rc = modperl_wbucket_flush(filter->wbucket, add_flush_bucket);
if (filter->rc != APR_SUCCESS) {
return filter->rc;
}
@@ -779,7 +797,8 @@
const char *buf,
apr_size_t *len)
{
- return modperl_wbucket_write(aTHX_ &filter->wbucket, buf, len);
+ WBUCKET_INIT(filter->wbucket, filter->pool, filter->f->next);
+ return modperl_wbucket_write(aTHX_ filter->wbucket, buf, len);
}
apr_status_t modperl_output_filter_handler(ap_filter_t *f,
@@ -800,7 +819,7 @@
filter = modperl_filter_new(f, bb, MP_OUTPUT_FILTER_MODE,
0, 0, 0);
status = modperl_run_filter(filter);
- safefree(filter);
+ FILTER_FREE(filter);
}
switch (status) {
@@ -834,7 +853,7 @@
filter = modperl_filter_new(f, bb, MP_INPUT_FILTER_MODE,
input_mode, block, readbytes);
status = modperl_run_filter(filter);
- safefree(filter);
+ FILTER_FREE(filter);
}
switch (status) {
1.70 +1 -1 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.69
retrieving revision 1.70
diff -u -u -r1.69 -r1.70
--- modperl_types.h 19 Aug 2003 05:01:22 -0000 1.69
+++ modperl_types.h 13 Dec 2003 23:40:31 -0000 1.70
@@ -193,7 +193,7 @@
ap_filter_t *f;
char *leftover;
apr_ssize_t remaining;
- modperl_wbucket_t wbucket;
+ modperl_wbucket_t *wbucket;
apr_bucket *bucket;
apr_bucket_brigade *bb_in;
apr_bucket_brigade *bb_out;
1.279 +4 -0 modperl-2.0/Changes
Index: Changes
===================================================================
RCS file: /home/cvs/modperl-2.0/Changes,v
retrieving revision 1.278
retrieving revision 1.279
diff -u -u -r1.278 -r1.279
--- Changes 12 Dec 2003 07:14:40 -0000 1.278
+++ Changes 13 Dec 2003 23:40:31 -0000 1.279
@@ -12,6 +12,10 @@
=item 1.99_12-dev
+Postpone the allocation of the wbucket in filters till the moment it's
+needed (if at all). Since non-streaming filters aren't going to use
+that buffer, it's a waste to allocate/free it. [Stas]
+
Extend the autogenerated bug report to include information about
installed modules of special interest (which may aid in understanding
the bug report), such as CGI.pm, Apache::Request, LWP, etc. [Stas]