dougm 01/03/14 21:39:09 Modified: src/modules/perl modperl_callback.c modperl_callback.h modperl_filter.c modperl_mgv.c modperl_mgv.h Log: VirtualHosts configured with 'PerlOptions +Parent' need to have autoloaded modules required into their own namespace Revision Changes Path 1.27 +4 -4 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.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- modperl_callback.c 2001/03/14 17:28:07 1.26 +++ modperl_callback.c 2001/03/15 05:39:06 1.27 @@ -62,7 +62,7 @@ } int modperl_callback(pTHX_ modperl_handler_t *handler, apr_pool_t *p, - AV *args) + server_rec *s, AV *args) { CV *cv=Nullcv; I32 flags = G_EVAL|G_SCALAR; @@ -113,12 +113,12 @@ cv = (CV*)SvRV(sv); } else { - GV *gv = modperl_mgv_lookup(aTHX_ handler->mgv_cv); + GV *gv = modperl_mgv_lookup_autoload(aTHX_ handler->mgv_cv, s, p); if (gv) { cv = modperl_mgv_cv(gv); } else { - char *name = modperl_mgv_as_string(aTHX_ handler->mgv_cv, p); + char *name = modperl_mgv_as_string(aTHX_ handler->mgv_cv, p, 0); MP_TRACE_h(MP_FUNC, "lookup of %s failed\n", name); } } @@ -268,7 +268,7 @@ }; for (i=0; i<av->nelts; i++) { - if ((status = modperl_callback(aTHX_ handlers[i], p, av_args)) != OK) { + if ((status = modperl_callback(aTHX_ handlers[i], p, s, av_args)) != OK) { status = modperl_errsv(aTHX_ status, r, s); } 1.15 +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.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- modperl_callback.h 2001/03/14 17:38:30 1.14 +++ modperl_callback.h 2001/03/15 05:39:07 1.15 @@ -18,7 +18,7 @@ void modperl_handler_make_args(pTHX_ AV **avp, ...); int modperl_callback(pTHX_ modperl_handler_t *handler, apr_pool_t *p, - AV *args); + server_rec *s, AV *args); int modperl_run_handlers(int idx, request_rec *r, conn_rec *c, server_rec *s, int type, ...); 1.9 +1 -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.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- modperl_filter.c 2001/03/14 00:37:52 1.8 +++ modperl_filter.c 2001/03/15 05:39:07 1.9 @@ -97,7 +97,7 @@ filter_classes[filter->mode], filter, NULL); - if ((status = modperl_callback(aTHX_ handler, p, args)) != OK) { + if ((status = modperl_callback(aTHX_ handler, p, s, args)) != OK) { status = modperl_errsv(aTHX_ status, r, s); } 1.3 +88 -11 modperl-2.0/src/modules/perl/modperl_mgv.c Index: modperl_mgv.c =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_mgv.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- modperl_mgv.c 2001/03/15 01:26:18 1.2 +++ modperl_mgv.c 2001/03/15 05:39:07 1.3 @@ -141,6 +141,33 @@ return Nullgv; } +#ifdef USE_ITHREADS +MP_INLINE GV *modperl_mgv_lookup_autoload(pTHX_ modperl_mgv_t *symbol, + server_rec *s, apr_pool_t *p) +{ + MP_dSCFG(s); + GV *gv = modperl_mgv_lookup(aTHX_ symbol); + + if (gv || !MpSrvPARENT(scfg)) { + return gv; + } + + /* + * this VirtualHost has its own parent interpreter + * must require the module again with this server's THX + */ + modperl_mgv_require_module(aTHX_ symbol, s, p); + + return modperl_mgv_lookup(aTHX_ symbol); +} +#else +MP_INLINE GV *modperl_mgv_lookup_autoload(pTHX_ modperl_mgv_t *symbol, + server_rec *s, apr_pool_t *p) +{ + return modperl_mgv_lookup(aTHX_ symbol); +} +#endif + int modperl_mgv_resolve(pTHX_ modperl_handler_t *handler, apr_pool_t *p, const char *name) { @@ -257,31 +284,53 @@ } char *modperl_mgv_as_string(pTHX_ modperl_mgv_t *symbol, - apr_pool_t *p) + apr_pool_t *p, int package) { char *string, *ptr; modperl_mgv_t *mgv; int len = 0; - for (mgv = symbol; mgv; mgv = mgv->next) { + for (mgv = symbol; (package ? mgv->next : mgv); mgv = mgv->next) { len += mgv->len; } ptr = string = apr_palloc(p, len+1); - for (mgv = symbol; mgv; mgv = mgv->next) { + for (mgv = symbol; (package ? mgv->next : mgv); mgv = mgv->next) { Copy(mgv->name, ptr, mgv->len, char); ptr += mgv->len; } - *ptr = '\0'; + if (package) { + *(ptr-2) = '\0'; /* trim trailing :: */ + } + else { + *ptr = '\0'; + } return string; } +#ifdef USE_ITHREADS +int modperl_mgv_require_module(pTHX_ modperl_mgv_t *symbol, + server_rec *s, apr_pool_t *p) +{ + char *package = + modperl_mgv_as_string(aTHX_ symbol, p, 1); + + if (modperl_require_module(aTHX_ package)) { + MP_TRACE_h(MP_FUNC, "reloaded %s for server %s\n", + package, modperl_server_desc(s, p)); + return TRUE; + } + + return FALSE; +} +#endif + /* precompute the hash(es) for handler names */ static void modperl_hash_handlers(pTHX_ apr_pool_t *p, server_rec *s, - MpAV *entry) + MpAV *entry, void *reload) { MP_dSCFG(s); int i; @@ -297,7 +346,18 @@ modperl_handler_t *handler = handlers[i]; if (MpHandlerPARSED(handler)) { - MP_TRACE_h(MP_FUNC, "%s already resolved\n", handler->name); +#ifdef USE_ITHREADS + if (reload && !modperl_mgv_lookup(aTHX_ handler->mgv_cv)) { + /* + * this VirtualHost has its own parent interpreter + * must require the module again with this server's THX + */ + modperl_mgv_require_module(aTHX_ handler->mgv_cv, + s, p); + } +#endif + MP_TRACE_h(MP_FUNC, "%s already resolved in server %s\n", + handler->name, modperl_server_desc(s, p)); } else { if (MpSrvAUTOLOAD(scfg)) { @@ -324,7 +384,7 @@ } for (i=0; i < MP_PER_DIR_NUM_HANDLERS; i++) { - modperl_hash_handlers(aTHX_ p, s, dir_cfg->handlers[i]); + modperl_hash_handlers(aTHX_ p, s, dir_cfg->handlers[i], data); } return 1; @@ -339,22 +399,22 @@ for (i=0; i < MP_PER_SRV_NUM_HANDLERS; i++) { modperl_hash_handlers(aTHX_ p, s, - scfg->handlers[i]); + scfg->handlers[i], data); } for (i=0; i < MP_PROCESS_NUM_HANDLERS; i++) { modperl_hash_handlers(aTHX_ p, s, - scfg->process_cfg->handlers[i]); + scfg->process_cfg->handlers[i], data); } for (i=0; i < MP_CONNECTION_NUM_HANDLERS; i++) { modperl_hash_handlers(aTHX_ p, s, - scfg->connection_cfg->handlers[i]); + scfg->connection_cfg->handlers[i], data); } for (i=0; i < MP_FILES_NUM_HANDLERS; i++) { modperl_hash_handlers(aTHX_ p, s, - scfg->files_cfg->handlers[i]); + scfg->files_cfg->handlers[i], data); } return 1; @@ -365,4 +425,21 @@ ap_pcw_walk_config(p, s, &perl_module, NULL, modperl_dw_hash_handlers, modperl_sw_hash_handlers); + +#ifdef USE_ITHREADS + /* check for parent interpreters in virtual hosts who need modules + * loaded in their own namespace + */ + for (s=s->next; s; s=s->next) { + MP_dSCFG(s); + + if (!MpSrvPARENT(scfg) || !MpSrvAUTOLOAD(scfg)) { + continue; + } + + ap_pcw_walk_config(p, s, &perl_module, (void*)TRUE, + modperl_dw_hash_handlers, + modperl_sw_hash_handlers); + } +#endif } 1.2 +9 -1 modperl-2.0/src/modules/perl/modperl_mgv.h Index: modperl_mgv.h =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_mgv.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- modperl_mgv.h 2001/03/09 23:42:04 1.1 +++ modperl_mgv.h 2001/03/15 05:39:07 1.2 @@ -7,6 +7,9 @@ GV *modperl_mgv_lookup(pTHX_ modperl_mgv_t *symbol); +GV *modperl_mgv_lookup_autoload(pTHX_ modperl_mgv_t *symbol, + server_rec *s, apr_pool_t *p); + int modperl_mgv_resolve(pTHX_ modperl_handler_t *handler, apr_pool_t *p, const char *name); @@ -14,7 +17,12 @@ const char *name); char *modperl_mgv_as_string(pTHX_ modperl_mgv_t *symbol, - apr_pool_t *p); + apr_pool_t *p, int package); + +#ifdef USE_ITHREADS +int modperl_mgv_require_module(pTHX_ modperl_mgv_t *symbol, + server_rec *s, apr_pool_t *p); +#endif void modperl_mgv_hash_handlers(apr_pool_t *p, server_rec *s);