dougm       01/03/13 21:22:51

  Modified:    src/modules/perl mod_perl.c modperl_callback.c
                        modperl_config.c modperl_config.h modperl_interp.c
                        modperl_types.h modperl_util.h
  Log:
  add PerlInterpLifetime directive
  default is request, when set to connection selected interpreter
  is held for lifetime of the connection
  
  Revision  Changes    Path
  1.31      +5 -0      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.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- mod_perl.c        2001/03/14 04:22:51     1.30
  +++ mod_perl.c        2001/03/14 05:22:49     1.31
  @@ -127,6 +127,9 @@
           MP_dSCFG(s);
   #ifdef MP_TRACE
           char *name = modperl_server_desc(s, p);
  +
  +        MP_TRACE_i(MP_FUNC, "PerlInterpLifetime set to %s for %s\n",
  +                   modperl_interp_lifetime_desc(scfg), name);
   #endif /* MP_TRACE */
   
           if (scfg->mip->tipool->idle) {
  @@ -217,6 +220,8 @@
                        "Min number of spare Perl interpreters"),
       MP_SRV_CMD_TAKE1("PerlInterpMaxRequests", interp_max_requests,
                        "Max number of requests per Perl interpreters"),
  +    MP_SRV_CMD_TAKE1("PerlInterpLifetime", interp_lifetime,
  +                     "Lifetime of a Perl interpreter (connection or request)"),
   #endif
       MP_CMD_ENTRIES,
       { NULL }, 
  
  
  
  1.25      +3 -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.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- modperl_callback.c        2001/03/14 00:37:52     1.24
  +++ modperl_callback.c        2001/03/14 05:22:49     1.25
  @@ -202,6 +202,9 @@
       }
   
   #ifdef USE_ITHREADS
  +    if (r && !c && modperl_interp_lifetime_connection(scfg)) {
  +        c = r->connection;
  +    }
       if (r || c) {
           p = c ? c->pool : r->pool;
           interp = modperl_interp_select(r, c, s);
  
  
  
  1.19      +34 -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.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- modperl_config.c  2001/03/09 23:46:35     1.18
  +++ modperl_config.c  2001/03/14 05:22:49     1.19
  @@ -127,6 +127,8 @@
           (modperl_tipool_config_t *)
           apr_pcalloc(p, sizeof(*scfg->interp_pool_cfg));
   
  +    scfg->interp_lifetime = MP_INTERP_LIFETIME_REQUEST;
  +
       /* XXX: determine reasonable defaults */
       scfg->interp_pool_cfg->start = 3;
       scfg->interp_pool_cfg->max_spare = 3;
  @@ -155,6 +157,7 @@
   #ifdef USE_ITHREADS
       merge_item(mip);
       merge_item(interp_pool_cfg);
  +    merge_item(interp_lifetime);
   #else
       merge_item(perl);
   #endif
  @@ -221,6 +224,37 @@
   }
   
   #ifdef USE_ITHREADS
  +
  +static const char *MP_interp_lifetime_desc[] = {
  +    "none", "request", "connection",
  +};
  +
  +const char *modperl_interp_lifetime_desc(modperl_srv_config_t *scfg)
  +{
  +    return MP_interp_lifetime_desc[scfg->interp_lifetime];
  +}
  +
  +MP_DECLARE_SRV_CMD(interp_lifetime)
  +{
  +    MP_dSCFG(parms->server);
  +
  +    switch (toLOWER(*arg)) {
  +      case 'r':
  +        if (strcaseEQ(arg, "request")) {
  +            scfg->interp_lifetime = MP_INTERP_LIFETIME_REQUEST;
  +            break;
  +        }
  +      case 'c':
  +        if (strcaseEQ(arg, "connection")) {
  +            scfg->interp_lifetime = MP_INTERP_LIFETIME_CONNECTION;
  +            break;
  +        }
  +      default:
  +        return "PerlInterpLifetime must be one of connection or request";
  +    };
  +
  +    return NULL;
  +}
   
   #define MP_IMP_INTERP_POOL_CFG(xitem) \
   const char *modperl_cmd_interp_##xitem(cmd_parms *parms, \
  
  
  
  1.18      +10 -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.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- modperl_config.h  2001/03/09 23:46:35     1.17
  +++ modperl_config.h  2001/03/14 05:22:49     1.18
  @@ -33,6 +33,16 @@
   MP_DECLARE_SRV_CMD(interp_max_spare);
   MP_DECLARE_SRV_CMD(interp_min_spare);
   MP_DECLARE_SRV_CMD(interp_max_requests);
  +MP_DECLARE_SRV_CMD(interp_lifetime);
  +
  +const char *modperl_interp_lifetime_desc(modperl_srv_config_t *scfg);
  +
  +#define modperl_interp_lifetime_connection(scfg) \
  +(scfg->interp_lifetime == MP_INTERP_LIFETIME_CONNECTION)
  +
  +#define modperl_interp_lifetime_request(scfg) \
  +(scfg->interp_lifetime == MP_INTERP_LIFETIME_REQUEST)
  +
   #endif
   
   #define MP_SRV_CMD_TAKE1(name, item, desc) \
  
  
  
  1.20      +4 -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.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- modperl_interp.c  2001/03/13 23:55:20     1.19
  +++ modperl_interp.c  2001/03/14 05:22:49     1.20
  @@ -205,11 +205,14 @@
   modperl_interp_t *modperl_interp_select(request_rec *r, conn_rec *c,
                                           server_rec *s)
   {
  +    MP_dSCFG(s);
       modperl_interp_t *interp;
       apr_pool_t *p = NULL;
       const char *desc = NULL;
  +    int lifetime_connection = 
  +        (modperl_interp_lifetime_connection(scfg) || !r);
   
  -    if (c) {
  +    if (c && lifetime_connection) {
           desc = "conn_rec pool";
           (void)apr_pool_userdata_get((void **)&interp, MP_INTERP_KEY, c->pool);
   
  
  
  
  1.23      +7 -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.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- modperl_types.h   2001/03/09 23:46:36     1.22
  +++ modperl_types.h   2001/03/14 05:22:50     1.23
  @@ -109,6 +109,12 @@
       int unset;
   } modperl_options_t;
   
  +typedef enum {
  +    MP_INTERP_LIFETIME_NONE,
  +    MP_INTERP_LIFETIME_REQUEST,
  +    MP_INTERP_LIFETIME_CONNECTION,
  +} modperl_interp_lifetime_e;
  +
   typedef struct {
       MpHV *SetVars;
       MpAV *PassEnv;
  @@ -120,6 +126,7 @@
   #ifdef USE_ITHREADS
       modperl_interp_pool_t *mip;
       modperl_tipool_config_t *interp_pool_cfg;
  +    modperl_interp_lifetime_e interp_lifetime;
   #else
       PerlInterpreter *perl;
   #endif
  
  
  
  1.6       +7 -0      modperl-2.0/src/modules/perl/modperl_util.h
  
  Index: modperl_util.h
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_util.h,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- modperl_util.h    2001/03/14 04:22:51     1.5
  +++ modperl_util.h    2001/03/14 05:22:50     1.6
  @@ -7,6 +7,13 @@
   #define MP_INLINE APR_INLINE
   #endif
   
  +#ifndef strcaseEQ
  +#   define strcaseEQ(s1,s2) (!strcasecmp(s1,s2))
  +#endif
  +#ifndef strncaseEQ
  +#   define strncaseEQ(s1,s2,l) (!strncasecmp(s1,s2,l))
  +#endif
  +
   MP_INLINE request_rec *modperl_sv2request_rec(pTHX_ SV *sv);
   
   MP_INLINE SV *modperl_ptr2obj(pTHX_ char *classname, void *ptr);
  
  
  

Reply via email to