dougm       01/03/14 23:04:41

  Modified:    src/modules/perl modperl_callback.c modperl_config.c
                        modperl_config.h modperl_interp.c modperl_types.h
  Log:
  support "PerlInterpLifetime handler"
  
  Revision  Changes    Path
  1.29      +3 -5      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.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- modperl_callback.c        2001/03/15 05:42:15     1.28
  +++ modperl_callback.c        2001/03/15 07:04:41     1.29
  @@ -282,11 +282,9 @@
       SvREFCNT_dec((SV*)av_args);
   
   #ifdef USE_ITHREADS
  -    if (interp && MpInterpPUTBACK_On(interp)) {
  -        /* XXX: might want to put interp back into available pool
  -         * rather than have it marked as in_use for the lifetime of
  -         * a request
  -         */
  +    if (interp && MpInterpPUTBACK(interp)) {
  +        /* PerlInterpLifetime handler */
  +        modperl_interp_unselect(interp);
       }
   #endif
   
  
  
  
  1.22      +16 -5     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.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- modperl_config.c  2001/03/15 02:17:35     1.21
  +++ modperl_config.c  2001/03/15 07:04:41     1.22
  @@ -234,7 +234,7 @@
   #ifdef USE_ITHREADS
   
   static const char *MP_interp_lifetime_desc[] = {
  -    "undef", "subrequest", "request", "connection",
  +    "undef", "handler", "subrequest", "request", "connection",
   };
   
   const char *modperl_interp_lifetime_desc(modperl_interp_lifetime_e lifetime)
  @@ -242,14 +242,20 @@
       return MP_interp_lifetime_desc[lifetime];
   }
   
  -#define MP_INTERP_LIFETIME_OPTS "PerlInterpLifetime must be one of "
  +#define MP_INTERP_LIFETIME_USAGE "PerlInterpLifetime must be one of "
   
   #define MP_INTERP_LIFETIME_DIR_OPTS \
  -MP_INTERP_LIFETIME_OPTS "subrequest or request"
  +"handler, subrequest or request"
   
  +#define MP_INTERP_LIFETIME_DIR_USAGE \
  +MP_INTERP_LIFETIME_USAGE MP_INTERP_LIFETIME_DIR_OPTS
  + 
   #define MP_INTERP_LIFETIME_SRV_OPTS \
  -MP_INTERP_LIFETIME_OPTS "subrequest, request or connection"
  +"connection, " MP_INTERP_LIFETIME_DIR_OPTS
   
  +#define MP_INTERP_LIFETIME_SRV_USAGE \
  +MP_INTERP_LIFETIME_USAGE MP_INTERP_LIFETIME_SRV_OPTS
  +
   MP_DECLARE_SRV_CMD(interp_lifetime)
   {
       modperl_interp_lifetime_e *lifetime;
  @@ -260,6 +266,11 @@
       lifetime = is_per_dir ? &dcfg->interp_lifetime : &scfg->interp_lifetime;
   
       switch (toLOWER(*arg)) {
  +      case 'h':
  +        if (strcaseEQ(arg, "handler")) {
  +            *lifetime = MP_INTERP_LIFETIME_HANDLER;
  +            break;
  +        }
         case 's':
           if (strcaseEQ(arg, "subrequest")) {
               *lifetime = MP_INTERP_LIFETIME_SUBREQUEST;
  @@ -277,7 +288,7 @@
           }
         default:
           return is_per_dir ?
  -            MP_INTERP_LIFETIME_DIR_OPTS : MP_INTERP_LIFETIME_SRV_OPTS;
  +            MP_INTERP_LIFETIME_DIR_USAGE : MP_INTERP_LIFETIME_SRV_USAGE;
       };
   
       return NULL;
  
  
  
  1.20      +3 -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.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- modperl_config.h  2001/03/14 08:22:48     1.19
  +++ modperl_config.h  2001/03/15 07:04:41     1.20
  @@ -40,6 +40,9 @@
   #define modperl_interp_lifetime_undef(dcfg) \
   (dcfg->interp_lifetime == MP_INTERP_LIFETIME_UNDEF)
   
  +#define modperl_interp_lifetime_handler(dcfg) \
  +(dcfg->interp_lifetime == MP_INTERP_LIFETIME_HANDLER)
  +
   #define modperl_interp_lifetime_subrequest(dcfg) \
   (dcfg->interp_lifetime == MP_INTERP_LIFETIME_SUBREQUEST)
   
  
  
  
  1.25      +25 -14    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.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- modperl_interp.c  2001/03/15 04:34:04     1.24
  +++ modperl_interp.c  2001/03/15 07:04:41     1.25
  @@ -189,6 +189,7 @@
       modperl_interp_pool_t *mip = interp->mip;
   
       MpInterpIN_USE_Off(interp);
  +    MpInterpPUTBACK_Off(interp);
   
       modperl_tipool_putback_data(mip->tipool, data, interp->num_requests);
   
  @@ -237,6 +238,9 @@
       MP_TRACE_i(MP_FUNC, "lifetime is per-%s\n",
                  modperl_interp_lifetime_desc(lifetime));
   
  +    /*
  +     * XXX: goto modperl_interp_get() if lifetime == handler ?
  +     */
       if (is_subrequest && (lifetime == MP_INTERP_LIFETIME_REQUEST)) {
           /* share 1 interpreter across sub-requests */
           r = r->main;
  @@ -282,26 +286,33 @@
           p = r->pool;
       }
   
  -    if (!p) {
  -        /* should never happen */
  -        MP_TRACE_i(MP_FUNC, "no pool\n");
  -        return NULL;
  -    }
  -
       interp = modperl_interp_get(s ? s : r->server);
       ++interp->num_requests; /* should only get here once per request */
   
  -    (void)apr_pool_userdata_set((void *)interp, MP_INTERP_KEY,
  -                                modperl_interp_unselect,
  -                                p);
  +    if (lifetime == MP_INTERP_LIFETIME_HANDLER) {
  +        /* caller is responsible for calling modperl_interp_unselect() */
  +        MpInterpPUTBACK_On(interp);
  +    }
  +    else {
  +        if (!p) {
  +            /* should never happen */
  +            MP_TRACE_i(MP_FUNC, "no pool\n");
  +            return NULL;
  +        }
   
  +        (void)apr_pool_userdata_set((void *)interp, MP_INTERP_KEY,
  +                                    modperl_interp_unselect,
  +                                    p);
  +
  +        MP_TRACE_i(MP_FUNC,
  +                   "set interp 0x%lx in %s 0x%lx (%s request for %s)\n",
  +                   (unsigned long)interp, desc, (unsigned long)p,
  +                   (r ? (is_subrequest ? "sub" : "main") : "conn"),
  +                   (r ? rr->uri : c->remote_ip));
  +    }
  +
       /* set context (THX) for this thread */
       PERL_SET_CONTEXT(interp->perl);
  -
  -    MP_TRACE_i(MP_FUNC, "set interp 0x%lx in %s 0x%lx (%s request for %s)\n",
  -               (unsigned long)interp, desc, (unsigned long)p,
  -               (r ? (is_subrequest ? "sub" : "main") : "conn"),
  -               (r ? rr->uri : c->remote_ip));
   
       return interp;
   }
  
  
  
  1.26      +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.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- modperl_types.h   2001/03/15 02:17:35     1.25
  +++ modperl_types.h   2001/03/15 07:04:41     1.26
  @@ -111,6 +111,7 @@
   
   typedef enum {
       MP_INTERP_LIFETIME_UNDEF,
  +    MP_INTERP_LIFETIME_HANDLER,
       MP_INTERP_LIFETIME_SUBREQUEST,
       MP_INTERP_LIFETIME_REQUEST,
       MP_INTERP_LIFETIME_CONNECTION,
  
  
  

Reply via email to