dougm 01/11/04 21:19:01
Modified: lib/ModPerl Code.pm
src/modules/perl modperl_callback.c modperl_config.c
modperl_config.h modperl_interp.c modperl_types.h
Log:
add a per-request cleanup function that properly deals with PerlInterpScope
Revision Changes Path
1.71 +1 -1 modperl-2.0/lib/ModPerl/Code.pm
Index: Code.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/lib/ModPerl/Code.pm,v
retrieving revision 1.70
retrieving revision 1.71
diff -u -r1.70 -r1.71
--- Code.pm 2001/09/28 15:16:06 1.70
+++ Code.pm 2001/11/05 05:19:01 1.71
@@ -96,7 +96,7 @@
Srv => ['NONE', @ithread_opts, qw(ENABLE AUTOLOAD MERGE_HANDLERS),
@hook_flags, 'UNSET'],
Dir => [qw(NONE PARSE_HEADERS SETUP_ENV MERGE_HANDLERS GLOBAL_REQUEST UNSET)],
- Req => [qw(NONE SET_GLOBAL_REQUEST SETUP_ENV)],
+ Req => [qw(NONE SET_GLOBAL_REQUEST SETUP_ENV CLEANUP_REGISTERED)],
Interp => [qw(NONE IN_USE PUTBACK CLONED BASE)],
Handler => [qw(NONE PARSED METHOD OBJECT ANON AUTOLOAD DYNAMIC)],
);
1.46 +8 -0 modperl-2.0/src/modules/perl/modperl_callback.c
Index: modperl_callback.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_callback.c,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -r1.45 -r1.46
--- modperl_callback.c 2001/10/06 21:05:40 1.45
+++ modperl_callback.c 2001/11/05 05:19:01 1.46
@@ -133,6 +133,14 @@
}
#endif
+ /* XXX: would like to do this in modperl_hook_create_request()
+ * but modperl_interp_select() is what figures out if
+ * PerlInterpScope eq handler, in which case we do not register
+ * a cleanup. modperl_hook_create_request() is also currently always
+ * run even if modperl isn't handling any part of the request
+ */
+ modperl_config_req_cleanup_register(r, rcfg);
+
switch (type) {
case MP_HANDLER_TYPE_PER_DIR:
case MP_HANDLER_TYPE_PER_SRV:
1.46 +22 -0 modperl-2.0/src/modules/perl/modperl_config.c
Index: modperl_config.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_config.c,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -r1.45 -r1.46
--- modperl_config.c 2001/10/29 01:19:16 1.45
+++ modperl_config.c 2001/11/05 05:19:01 1.46
@@ -227,6 +227,28 @@
return mrg;
}
+/* any per-request cleanup goes here */
+
+apr_status_t modperl_config_request_cleanup(pTHX_ request_rec *r)
+{
+ MP_dRCFG;
+
+ if (rcfg->pnotes) {
+ SvREFCNT_dec(rcfg->pnotes);
+ rcfg->pnotes = Nullhv;
+ }
+
+ return APR_SUCCESS;
+}
+
+apr_status_t modperl_config_req_cleanup(void *data)
+{
+ request_rec *r = (request_rec *)data;
+ MP_dTHX;
+
+ return modperl_config_request_cleanup(aTHX_ r);
+}
+
void *modperl_get_perl_module_config(ap_conf_vector_t *cv)
{
return ap_get_module_config(cv, &perl_module);
1.30 +13 -0 modperl-2.0/src/modules/perl/modperl_config.h
Index: modperl_config.h
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_config.h,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- modperl_config.h 2001/10/22 17:20:11 1.29
+++ modperl_config.h 2001/11/05 05:19:01 1.30
@@ -20,6 +20,19 @@
#define modperl_config_srv_argv_push(arg) \
*(const char **)apr_array_push(scfg->argv) = arg
+apr_status_t modperl_config_request_cleanup(pTHX_ request_rec *r);
+
+apr_status_t modperl_config_req_cleanup(void *data);
+
+#define modperl_config_req_cleanup_register(r, rcfg) \
+ if (r && !MpReqCLEANUP_REGISTERED(rcfg)) { \
+ apr_pool_cleanup_register(r->pool, \
+ (void*)r, \
+ modperl_config_req_cleanup, \
+ apr_pool_cleanup_null); \
+ MpReqCLEANUP_REGISTERED_On(rcfg); \
+ }
+
void *modperl_get_perl_module_config(ap_conf_vector_t *cv);
void modperl_set_perl_module_config(ap_conf_vector_t *cv, void *cfg);
1.38 +10 -0 modperl-2.0/src/modules/perl/modperl_interp.c
Index: modperl_interp.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_interp.c,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -r1.37 -r1.38
--- modperl_interp.c 2001/11/01 23:50:32 1.37
+++ modperl_interp.c 2001/11/05 05:19:01 1.38
@@ -222,6 +222,14 @@
modperl_interp_t *interp = (modperl_interp_t *)data;
modperl_interp_pool_t *mip = interp->mip;
+ if (interp->request) {
+ /* ithreads + a threaded mpm + PerlInterpScope handler */
+ request_rec *r = interp->request;
+ MP_dRCFG;
+ modperl_config_request_cleanup(interp->perl, r);
+ MpReqCLEANUP_REGISTERED_Off(rcfg);
+ }
+
MpInterpIN_USE_Off(interp);
MpInterpPUTBACK_Off(interp);
@@ -351,6 +359,8 @@
if (scope == MP_INTERP_SCOPE_HANDLER) {
/* caller is responsible for calling modperl_interp_unselect() */
+ interp->request = r;
+ MpReqCLEANUP_REGISTERED_On(rcfg);
MpInterpPUTBACK_On(interp);
}
else {
1.53 +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.52
retrieving revision 1.53
diff -u -r1.52 -r1.53
--- modperl_types.h 2001/10/19 16:40:44 1.52
+++ modperl_types.h 2001/11/05 05:19:01 1.53
@@ -42,6 +42,7 @@
PerlInterpreter *perl;
int num_requests;
U8 flags;
+ request_rec *request;
#ifdef MP_TRACE
unsigned long tid;
#endif