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
  
  
  


Reply via email to