cvs commit: modperl-2.0/src/modules/perl modperl_interp.c

2001-03-13 Thread dougm

dougm   01/03/13 22:57:44

  Modified:src/modules/perl modperl_interp.c
  Log:
  share selected Perl interpreter across sub-requests by default
  
  Revision  ChangesPath
  1.21  +10 -5 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.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- modperl_interp.c  2001/03/14 05:22:49 1.20
  +++ modperl_interp.c  2001/03/14 06:57:43 1.21
  @@ -202,12 +202,14 @@
*/
   #define MP_INTERP_KEY "MODPERL_INTERP"
   
  -modperl_interp_t *modperl_interp_select(request_rec *r, conn_rec *c,
  +modperl_interp_t *modperl_interp_select(request_rec *rr, conn_rec *c,
   server_rec *s)
   {
   MP_dSCFG(s);
   modperl_interp_t *interp;
   apr_pool_t *p = NULL;
  +int is_subrequest = (rr && rr->main) ? 1 : 0;
  +request_rec *r = is_subrequest ? rr->main : rr;
   const char *desc = NULL;
   int lifetime_connection = 
   (modperl_interp_lifetime_connection(scfg) || !r);
  @@ -231,8 +233,9 @@
   
   if (interp) {
   MP_TRACE_i(MP_FUNC,
  -   "found interp 0x%lx in %s 0x%lx\n",
  -   (unsigned long)interp, desc, (unsigned long)r->pool);
  +   "found interp 0x%lx in %s 0x%lx (%s request for %s)\n",
  +   (unsigned long)interp, desc, (unsigned long)r->pool,
  +   (is_subrequest ? "sub" : "main"), rr->uri);
   return interp;
   }
   
  @@ -267,8 +270,10 @@
   /* set context (THX) for this thread */
   PERL_SET_CONTEXT(interp->perl);
   
  -MP_TRACE_i(MP_FUNC, "set interp 0x%lx in %s 0x%lx\n",
  -   (unsigned long)interp, desc, (unsigned long)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));
   
   return interp;
   }
  
  
  



cvs commit: modperl-2.0/src/modules/perl mod_perl.c modperl_callback.c modperl_config.c modperl_config.h modperl_interp.c modperl_types.h modperl_util.h

2001-03-13 Thread dougm

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  ChangesPath
  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.c2001/03/14 04:22:51 1.30
  +++ mod_perl.c2001/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.c2001/03/14 00:37:52 1.24
  +++ modperl_callback.c2001/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_l

cvs commit: modperl-2.0/src/modules/perl mod_perl.c modperl_util.c modperl_util.h

2001-03-13 Thread dougm

dougm   01/03/13 20:22:51

  Modified:src/modules/perl mod_perl.c modperl_util.c modperl_util.h
  Log:
  add modperl_server_desc() function
  add more trace details when initializing the interpreter pool
  
  Revision  ChangesPath
  1.30  +25 -6 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.29
  retrieving revision 1.30
  diff -u -r1.29 -r1.30
  --- mod_perl.c2001/03/09 23:46:34 1.29
  +++ mod_perl.c2001/03/14 04:22:51 1.30
  @@ -93,7 +93,7 @@
*/
   if (MpSrvPARENT(scfg) || MpSrvCLONE(scfg)) {
   MP_TRACE_i(MP_FUNC, "modperl_interp_init() server=%s\n",
  -   s->server_hostname);
  +   modperl_server_desc(s, p));
   modperl_interp_init(s, p, perl);
   }
   
  @@ -118,20 +118,39 @@
   #ifdef USE_ITHREADS
   static void modperl_init_clones(server_rec *s, apr_pool_t *p)
   {
  +#ifdef MP_TRACE
  +modperl_srv_config_t *base_scfg = modperl_srv_config_get(s);
  +char *base_name = modperl_server_desc(s, p);
  +#endif /* MP_TRACE */
  +
   for (; s; s=s->next) {
   MP_dSCFG(s);
  +#ifdef MP_TRACE
  +char *name = modperl_server_desc(s, p);
  +#endif /* MP_TRACE */
  +
   if (scfg->mip->tipool->idle) {
  -MP_TRACE_i(MP_FUNC, "%s interp already cloned\n",
  -   s->server_hostname);
  +#ifdef MP_TRACE
  +if (scfg->mip == base_scfg->mip) {
  +MP_TRACE_i(MP_FUNC,
  +   "%s interp pool inherited from %s\n",
  +   name, base_name);
  +}
  +else {
  +MP_TRACE_i(MP_FUNC,
  +   "%s interp pool already initialized\n",
  +   name);
  +}
  +#endif /* MP_TRACE */
   }
   else {
  -MP_TRACE_i(MP_FUNC, "cloning interp for %s\n",
  -   s->server_hostname);
  +MP_TRACE_i(MP_FUNC, "initializing interp pool for %s\n",
  +   name);
   modperl_tipool_init(scfg->mip->tipool);
   }
   }
   }
  -#endif
  +#endif /* USE_ITHREADS */
   
   void modperl_hook_init(apr_pool_t *pconf, apr_pool_t *plog, 
  apr_pool_t *ptemp, server_rec *s)
  
  
  
  1.5   +5 -0  modperl-2.0/src/modules/perl/modperl_util.c
  
  Index: modperl_util.c
  ===
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_util.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- modperl_util.c2001/03/13 05:09:02 1.4
  +++ modperl_util.c2001/03/14 04:22:51 1.5
  @@ -81,3 +81,8 @@
   
   return status;
   }
  +
  +char *modperl_server_desc(server_rec *s, apr_pool_t *p)
  +{
  +return apr_psprintf(p, "%s:%u", s->server_hostname, s->port);
  +}
  
  
  
  1.5   +2 -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.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- modperl_util.h2001/03/09 23:46:36 1.4
  +++ modperl_util.h2001/03/14 04:22:51 1.5
  @@ -20,4 +20,6 @@
   
   int modperl_require_module(pTHX_ const char *pv);
   
  +char *modperl_server_desc(server_rec *s, apr_pool_t *p);
  +
   #endif /* MODPERL_UTIL_H */
  
  
  



cvs commit: modperl-2.0/src/modules/perl modperl_callback.c modperl_callback.h modperl_filter.c

2001-03-13 Thread dougm

dougm   01/03/13 16:37:53

  Modified:src/modules/perl modperl_callback.c modperl_callback.h
modperl_filter.c
  Log:
  pass an AV** rather than AV* to modperl_handler_make_args(), which will create the 
newAV() if needed
  
  Revision  ChangesPath
  1.24  +11 -8 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.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- modperl_callback.c2001/03/14 00:20:52 1.23
  +++ modperl_callback.c2001/03/14 00:37:52 1.24
  @@ -18,11 +18,15 @@
   return modperl_handler_new(p, h->name);
   }
   
  -void modperl_handler_make_args(pTHX_ AV *av, ...)
  +void modperl_handler_make_args(pTHX_ AV **avp, ...)
   {
   va_list args;
   
  -va_start(args, av);
  +if (!*avp) {
  +*avp = newAV(); /* XXX: cache an intialized AV* per-request */
  +}
  +
  +va_start(args, avp);
   
   for (;;) {
   char *classname = va_arg(args, char *);
  @@ -51,7 +55,7 @@
   break;
   }
   
  -av_push(av, sv);
  +av_push(*avp, sv);
   }
   
   va_end(args);
  @@ -213,16 +217,15 @@
   MP_TRACE_h(MP_FUNC, "running %d %s handlers\n",
  av->nelts, desc);
   handlers = (modperl_handler_t **)av->elts;
  -av_args = newAV();
   
   switch (type) {
 case MP_HANDLER_TYPE_DIR:
 case MP_HANDLER_TYPE_SRV:
  -modperl_handler_make_args(aTHX_ av_args,
  +modperl_handler_make_args(aTHX_ &av_args,
 "Apache::RequestRec", r, NULL);
   break;
 case MP_HANDLER_TYPE_CONN:
  -modperl_handler_make_args(aTHX_ av_args,
  +modperl_handler_make_args(aTHX_ &av_args,
 "Apache::Connection", c, NULL);
   break;
 case MP_HANDLER_TYPE_FILE:
  @@ -235,7 +238,7 @@
 ptemp = va_arg(args, apr_pool_t *);
 va_end(args);
   
  -  modperl_handler_make_args(aTHX_ av_args,
  +  modperl_handler_make_args(aTHX_ &av_args,
   "Apache::Pool", pconf,
   "Apache::Pool", plog,
   "Apache::Pool", ptemp,
  @@ -254,7 +257,7 @@
 p = pconf;
 }
   
  -  modperl_handler_make_args(aTHX_ av_args,
  +  modperl_handler_make_args(aTHX_ &av_args,
   "Apache::Pool", pconf,
   "Apache::Server", s, NULL);
 }
  
  
  
  1.12  +1 -1  modperl-2.0/src/modules/perl/modperl_callback.h
  
  Index: modperl_callback.h
  ===
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_callback.h,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- modperl_callback.h2001/03/09 23:46:35 1.11
  +++ modperl_callback.h2001/03/14 00:37:52 1.12
  @@ -21,7 +21,7 @@
   modperl_handler_t *modperl_handler_dup(apr_pool_t *p,
  modperl_handler_t *h);
   
  -void modperl_handler_make_args(pTHX_ AV *avp, ...);
  +void modperl_handler_make_args(pTHX_ AV **avp, ...);
   
   int modperl_callback(pTHX_ modperl_handler_t *handler, apr_pool_t *p,
AV *args);
  
  
  
  1.8   +2 -4  modperl-2.0/src/modules/perl/modperl_filter.c
  
  Index: modperl_filter.c
  ===
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_filter.c,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- modperl_filter.c  2001/03/14 00:03:29 1.7
  +++ modperl_filter.c  2001/03/14 00:37:52 1.8
  @@ -81,7 +81,7 @@
   
   int modperl_run_filter(modperl_filter_t *filter)
   {
  -AV *args;
  +AV *args = Nullav;
   int status;
   modperl_handler_t *handler =
   ((modperl_filter_ctx_t *)filter->f->ctx)->handler;
  @@ -93,9 +93,7 @@
   
   MP_dINTERP_SELECT(r, c, s);
   
  -args = newAV();
  -
  -modperl_handler_make_args(aTHX_ args,
  +modperl_handler_make_args(aTHX_ &args,
 filter_classes[filter->mode], filter,
 NULL);
   
  
  
  



cvs commit: modperl-2.0/src/modules/perl modperl_callback.c

2001-03-13 Thread dougm

dougm   01/03/13 16:20:53

  Modified:src/modules/perl modperl_callback.c
  Log:
  add support for IV and PV in modperl_handler_make_args()
  
  Revision  ChangesPath
  1.23  +16 -1 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.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- modperl_callback.c2001/03/13 23:55:18 1.22
  +++ modperl_callback.c2001/03/14 00:20:52 1.23
  @@ -35,7 +35,22 @@
   
   ptr = va_arg(args, void *);
   
  -sv = modperl_ptr2obj(aTHX_ classname, ptr);
  +switch (*classname) {
  +  case 'I':
  +if (strEQ(classname, "IV")) {
  +sv = ptr ? newSViv((IV)ptr) : &PL_sv_undef;
  +break;
  +}
  +  case 'P':
  +if (strEQ(classname, "PV")) {
  +sv = ptr ? newSVpv((char *)ptr, 0) : &PL_sv_undef;
  +break;
  +}
  +  default:
  +sv = modperl_ptr2obj(aTHX_ classname, ptr);
  +break;
  +}
  +
   av_push(av, sv);
   }
   
  
  
  



cvs commit: modperl-2.0/src/modules/perl modperl_filter.c modperl_interp.h

2001-03-13 Thread dougm

dougm   01/03/13 16:03:31

  Modified:src/modules/perl modperl_filter.c modperl_interp.h
  Log:
  add MP_dINTERP_SELECT macro so caller doesnt need to deal with THX
  
  Revision  ChangesPath
  1.7   +1 -6  modperl-2.0/src/modules/perl/modperl_filter.c
  
  Index: modperl_filter.c
  ===
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_filter.c,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- modperl_filter.c  2001/03/13 23:55:19 1.6
  +++ modperl_filter.c  2001/03/14 00:03:29 1.7
  @@ -91,12 +91,7 @@
   server_rec  *s = r ? r->server : NULL;
   apr_pool_t  *p = r ? r->pool : c->pool;
   
  -#ifdef USE_ITHREADS
  -pTHX;
  -modperl_interp_t *interp = NULL;
  -interp = modperl_interp_select(r, c, s);
  -aTHX = interp->perl;
  -#endif
  +MP_dINTERP_SELECT(r, c, s);
   
   args = newAV();
   
  
  
  
  1.8   +8 -0  modperl-2.0/src/modules/perl/modperl_interp.h
  
  Index: modperl_interp.h
  ===
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_interp.h,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- modperl_interp.h  2000/08/14 03:10:45 1.7
  +++ modperl_interp.h  2001/03/14 00:03:29 1.8
  @@ -21,6 +21,12 @@
   modperl_interp_t *modperl_interp_select(request_rec *r, conn_rec *c,
   server_rec *s);
   
  +#define MP_dINTERP_SELECT(r, c, s) \
  +pTHX; \
  +modperl_interp_t *interp = NULL; \
  +interp = modperl_interp_select(r, c, s); \
  +aTHX = interp->perl
  +
   apr_status_t modperl_interp_pool_destroy(void *data);
   
   void modperl_interp_pool_add(modperl_interp_pool_t *mip,
  @@ -29,6 +35,8 @@
   void modperl_interp_pool_remove(modperl_interp_pool_t *mip,
   modperl_interp_t *interp);
   
  +#else
  +#define MP_dINTERP_SELECT(r, c, s) dNOOP
   #endif
   
   #endif /* MODPERL_INTERP_H */
  
  
  



cvs commit: modperl-2.0/src/modules/perl modperl_callback.c modperl_filter.c modperl_interp.c

2001-03-13 Thread dougm

dougm   01/03/13 15:55:21

  Modified:src/modules/perl modperl_callback.c modperl_filter.c
modperl_interp.c
  Log:
  modperl_interp_select() will PERL_SET_CONTEXT for the given thread, so the caller 
does not need to
  
  Revision  ChangesPath
  1.22  +1 -1  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.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- modperl_callback.c2001/03/09 23:46:35 1.21
  +++ modperl_callback.c2001/03/13 23:55:18 1.22
  @@ -191,8 +191,8 @@
   else {
   /* Child{Init,Exit}, OpenLogs */
   aTHX = scfg->mip->parent->perl;
  +PERL_SET_CONTEXT(aTHX);
   }
  -PERL_SET_CONTEXT(aTHX);
   #endif
   
   MP_TRACE_h(MP_FUNC, "running %d %s handlers\n",
  
  
  
  1.6   +0 -1  modperl-2.0/src/modules/perl/modperl_filter.c
  
  Index: modperl_filter.c
  ===
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_filter.c,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- modperl_filter.c  2001/03/09 23:46:35 1.5
  +++ modperl_filter.c  2001/03/13 23:55:19 1.6
  @@ -96,7 +96,6 @@
   modperl_interp_t *interp = NULL;
   interp = modperl_interp_select(r, c, s);
   aTHX = interp->perl;
  -PERL_SET_CONTEXT(aTHX);
   #endif
   
   args = newAV();
  
  
  
  1.19  +3 -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.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- modperl_interp.c  2001/03/09 23:46:35 1.18
  +++ modperl_interp.c  2001/03/13 23:55:20 1.19
  @@ -261,6 +261,9 @@
   modperl_interp_unselect,
   p);
   
  +/* set context (THX) for this thread */
  +PERL_SET_CONTEXT(interp->perl);
  +
   MP_TRACE_i(MP_FUNC, "set interp 0x%lx in %s 0x%lx\n",
  (unsigned long)interp, desc, (unsigned long)p);