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);
   
  
  
  


Reply via email to