dougm 02/01/07 17:13:29
Modified: src/modules/perl mod_perl.c mod_perl.h modperl_interp.c
Log:
fix so perl_destruct (and things like END blocks) are run in child
processes when they are shutdown
Revision Changes Path
1.103 +30 -3 modperl-2.0/src/modules/perl/mod_perl.c
Index: mod_perl.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/mod_perl.c,v
retrieving revision 1.102
retrieving revision 1.103
diff -u -r1.102 -r1.103
--- mod_perl.c 6 Jan 2002 21:39:36 -0000 1.102
+++ mod_perl.c 8 Jan 2002 01:13:28 -0000 1.103
@@ -128,6 +128,20 @@
SAVEDESTRUCTOR_X(modperl_boot, 0);
}
+/*
+ * the "server_pool" is a subpool of the parent pool (aka "pconf")
+ * this is where we register the cleanups that teardown the interpreter.
+ * the parent process will run the cleanups since server_pool is a subpool
+ * of pconf. we manually clear the server_pool to run cleanups in the
+ * child processes
+ */
+static apr_pool_t *server_pool = NULL;
+
+apr_pool_t *modperl_server_pool(void)
+{
+ return server_pool;
+}
+
PerlInterpreter *modperl_startup(server_rec *s, apr_pool_t *p)
{
AV *endav;
@@ -198,8 +212,8 @@
}
#ifndef USE_ITHREADS
- cdata = modperl_cleanup_data_new(p, (void*)perl);
- apr_pool_cleanup_register(p, cdata,
+ cdata = modperl_cleanup_data_new(server_pool, (void*)perl);
+ apr_pool_cleanup_register(server_pool, cdata,
modperl_shutdown, apr_pool_cleanup_null);
#endif
@@ -380,8 +394,10 @@
int modperl_hook_init(apr_pool_t *pconf, apr_pool_t *plog,
apr_pool_t *ptemp, server_rec *s)
{
+ apr_pool_create(&server_pool, pconf);
+
modperl_sys_init();
- apr_pool_cleanup_register(pconf, NULL,
+ apr_pool_cleanup_register(server_pool, NULL,
modperl_sys_term, apr_pool_cleanup_null);
modperl_init_globals(s, pconf);
modperl_init(s, pconf);
@@ -461,9 +477,20 @@
return OK;
}
+static apr_status_t modperl_child_exit(void *data)
+{
+ apr_pool_clear(server_pool);
+ server_pool = NULL;
+
+ return APR_SUCCESS;
+}
+
static void modperl_hook_child_init(apr_pool_t *p, server_rec *s)
{
modperl_perl_init_ids_server(s);
+
+ apr_pool_cleanup_register(p, NULL, modperl_child_exit,
+ apr_pool_cleanup_null);
}
void modperl_register_hooks(apr_pool_t *p)
1.40 +1 -0 modperl-2.0/src/modules/perl/mod_perl.h
Index: mod_perl.h
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/mod_perl.h,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -r1.39 -r1.40
--- mod_perl.h 24 Nov 2001 01:15:01 -0000 1.39
+++ mod_perl.h 8 Jan 2002 01:13:28 -0000 1.40
@@ -45,6 +45,7 @@
void modperl_pre_config_handler(apr_pool_t *p, apr_pool_t *plog,
apr_pool_t *ptemp);
void modperl_register_hooks(apr_pool_t *p);
+apr_pool_t *modperl_server_pool(void);
PerlInterpreter *modperl_startup(server_rec *s, apr_pool_t *p);
void xs_init(pTHXo);
1.39 +2 -1 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.38
retrieving revision 1.39
diff -u -r1.38 -r1.39
--- modperl_interp.c 5 Nov 2001 05:19:01 -0000 1.38
+++ modperl_interp.c 8 Jan 2002 01:13:28 -0000 1.39
@@ -191,6 +191,7 @@
void modperl_interp_init(server_rec *s, apr_pool_t *p,
PerlInterpreter *perl)
{
+ apr_pool_t *server_pool = modperl_server_pool();
pTHX;
MP_dSCFG(s);
@@ -210,7 +211,7 @@
/* this happens post-config in mod_perl.c:modperl_init_clones() */
/* modperl_tipool_init(tipool); */
- apr_pool_cleanup_register(p, (void*)mip,
+ apr_pool_cleanup_register(server_pool, (void*)mip,
modperl_interp_pool_destroy,
apr_pool_cleanup_null);