cvs commit: modperl-2.0/src/modules/perl modperl_callback.c modperl_callback.h modperl_filter.c
dougm 01/10/06 14:05:40 Modified:src/modules/perl modperl_callback.c modperl_callback.h modperl_filter.c Log: pass a request_rec to modperl_callback() for future use Revision ChangesPath 1.45 +2 -2 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.44 retrieving revision 1.45 diff -u -r1.44 -r1.45 --- modperl_callback.c2001/09/28 15:16:06 1.44 +++ modperl_callback.c2001/10/06 21:05:40 1.45 @@ -1,7 +1,7 @@ #include "mod_perl.h" int modperl_callback(pTHX_ modperl_handler_t *handler, apr_pool_t *p, - server_rec *s, AV *args) + request_rec *r, server_rec *s, AV *args) { CV *cv=Nullcv; I32 flags = G_EVAL|G_SCALAR; @@ -168,7 +168,7 @@ handlers = (modperl_handler_t **)av->elts; for (i=0; inelts; i++) { -if ((status = modperl_callback(aTHX_ handlers[i], p, s, av_args)) != OK) { +if ((status = modperl_callback(aTHX_ handlers[i], p, r, s, av_args)) != OK) { status = modperl_errsv(aTHX_ status, r, s); } 1.19 +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.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- modperl_callback.h2001/03/16 17:23:24 1.18 +++ modperl_callback.h2001/10/06 21:05:40 1.19 @@ -11,7 +11,7 @@ #define ap_hook_logap_hook_log_transaction int modperl_callback(pTHX_ modperl_handler_t *handler, apr_pool_t *p, - server_rec *s, AV *args); + request_rec *r, server_rec *s, AV *args); int modperl_callback_run_handlers(int idx, int type, request_rec *r, conn_rec *c, server_rec *s, 1.26 +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.25 retrieving revision 1.26 diff -u -r1.25 -r1.26 --- modperl_filter.c 2001/08/30 05:15:51 1.25 +++ modperl_filter.c 2001/10/06 21:05:40 1.26 @@ -140,7 +140,7 @@ av_push(args, newSViv(*readbytes)); } -if ((status = modperl_callback(aTHX_ handler, p, s, args)) != OK) { +if ((status = modperl_callback(aTHX_ handler, p, r, s, args)) != OK) { status = modperl_errsv(aTHX_ status, r, s); }
cvs commit: modperl-2.0/src/modules/perl modperl_callback.c modperl_callback.h modperl_handler.c modperl_handler.h modperl_types.h
dougm 01/03/16 09:23:31 Modified:src/modules/perl modperl_callback.c modperl_callback.h modperl_handler.c modperl_handler.h modperl_types.h Log: prototype the 3 pools in run_handlers() rather that use va_args, so we can have a pool sooner rather than later pass lookup_hanalders() an lvalue arg and pool so it can create the handler array if needed add handler vectors to per-request config (will be used for set/push handlers) Revision ChangesPath 1.35 +38 -51modperl-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.34 retrieving revision 1.35 diff -u -r1.34 -r1.35 --- modperl_callback.c2001/03/16 06:57:42 1.34 +++ modperl_callback.c2001/03/16 17:23:23 1.35 @@ -91,8 +91,11 @@ return status; } -int modperl_callback_run_handlers(int idx, request_rec *r, conn_rec *c, - server_rec *s, int type, ...) +int modperl_callback_run_handlers(int idx, int type, + request_rec *r, conn_rec *c, server_rec *s, + apr_pool_t *pconf, + apr_pool_t *plog, + apr_pool_t *ptemp) { #ifdef USE_ITHREADS pTHX; @@ -105,7 +108,6 @@ MpAV *av, **avp; int i, status = OK; const char *desc = NULL; -va_list args; AV *av_args = Nullav; if (!MpSrvENABLED(scfg)) { @@ -114,8 +116,15 @@ return DECLINED; } -avp = modperl_handler_lookup_handlers(dcfg, scfg, NULL, - type, idx, &desc); +if (r || c) { +p = c ? c->pool : r->pool; +} +else { +p = pconf; +} + +avp = modperl_handler_lookup_handlers(dcfg, scfg, NULL, p, + type, idx, FALSE, &desc); if (!(avp && (av = *avp))) { MP_TRACE_h(MP_FUNC, "no %s handlers configured (%s)\n", @@ -128,7 +137,6 @@ c = r->connection; } if (r || c) { -p = c ? c->pool : r->pool; interp = modperl_interp_select(r, c, s); aTHX = interp->perl; } @@ -150,39 +158,17 @@ "Apache::Connection", c, NULL); break; case MP_HANDLER_TYPE_FILES: - { - apr_pool_t *pconf, *plog, *ptemp; - - va_start(args, type); - pconf = va_arg(args, apr_pool_t *); - plog = va_arg(args, apr_pool_t *); - ptemp = va_arg(args, apr_pool_t *); - va_end(args); - - modperl_handler_make_args(aTHX_ &av_args, -"Apache::Pool", pconf, -"Apache::Pool", plog, -"Apache::Pool", ptemp, -"Apache::Server", s, NULL); - } - break; +modperl_handler_make_args(aTHX_ &av_args, + "Apache::Pool", pconf, + "Apache::Pool", plog, + "Apache::Pool", ptemp, + "Apache::Server", s, NULL); +break; case MP_HANDLER_TYPE_PROCESS: - { - apr_pool_t *pconf; - - va_start(args, type); - pconf = va_arg(args, apr_pool_t *); - va_end(args); - - if (!p) { - p = pconf; - } - - modperl_handler_make_args(aTHX_ &av_args, -"Apache::Pool", pconf, -"Apache::Server", s, NULL); - } - break; +modperl_handler_make_args(aTHX_ &av_args, + "Apache::Pool", pconf, + "Apache::Server", s, NULL); +break; }; MP_TRACE_h(MP_FUNC, "running %d %s handlers\n", @@ -212,36 +198,37 @@ int modperl_callback_per_dir(int idx, request_rec *r) { -return modperl_callback_run_handlers(idx, r, NULL, - r->server, - MP_HANDLER_TYPE_PER_DIR); +return modperl_callback_run_handlers(idx, MP_HANDLER_TYPE_PER_DIR, + r, NULL, r->server, + NULL, NULL, NULL); } int modperl_callback_per_srv(int idx, request_rec *r) { -return modperl_callback_run_handlers(idx, r, NULL, -
cvs commit: modperl-2.0/src/modules/perl modperl_callback.c modperl_callback.h modperl_filter.c modperl_mgv.c modperl_mgv.h
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 ChangesPath 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.c2001/03/14 17:28:07 1.26 +++ modperl_callback.c2001/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; inelts; 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.h2001/03/14 17:38:30 1.14 +++ modperl_callback.h2001/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 -11modperl-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, -
cvs commit: modperl-2.0/src/modules/perl modperl_callback.c modperl_callback.h
dougm 01/03/14 09:28:07 Modified:src/modules/perl modperl_callback.c modperl_callback.h Log: canonicalize MP_HANDLER_TYPE_ names Revision ChangesPath 1.26 +17 -15modperl-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.25 retrieving revision 1.26 diff -u -r1.25 -r1.26 --- modperl_callback.c2001/03/14 05:22:49 1.25 +++ modperl_callback.c2001/03/14 17:28:07 1.26 @@ -173,23 +173,23 @@ } switch (type) { - case MP_HANDLER_TYPE_DIR: + case MP_HANDLER_TYPE_PER_DIR: av = dcfg->handlers[idx]; MP_TRACE_a_do(desc = modperl_per_dir_handler_desc(idx)); break; - case MP_HANDLER_TYPE_SRV: + case MP_HANDLER_TYPE_PER_SRV: av = scfg->handlers[idx]; MP_TRACE_a_do(desc = modperl_per_srv_handler_desc(idx)); break; - case MP_HANDLER_TYPE_CONN: + case MP_HANDLER_TYPE_CONNECTION: av = scfg->connection_cfg->handlers[idx]; MP_TRACE_a_do(desc = modperl_connection_handler_desc(idx)); break; - case MP_HANDLER_TYPE_FILE: + case MP_HANDLER_TYPE_FILES: av = scfg->files_cfg->handlers[idx]; MP_TRACE_a_do(desc = modperl_files_handler_desc(idx)); break; - case MP_HANDLER_TYPE_PROC: + case MP_HANDLER_TYPE_PROCESS: av = scfg->process_cfg->handlers[idx]; MP_TRACE_a_do(desc = modperl_process_handler_desc(idx)); break; @@ -222,16 +222,16 @@ handlers = (modperl_handler_t **)av->elts; switch (type) { - case MP_HANDLER_TYPE_DIR: - case MP_HANDLER_TYPE_SRV: + case MP_HANDLER_TYPE_PER_DIR: + case MP_HANDLER_TYPE_PER_SRV: modperl_handler_make_args(aTHX_ &av_args, "Apache::RequestRec", r, NULL); break; - case MP_HANDLER_TYPE_CONN: + case MP_HANDLER_TYPE_CONNECTION: modperl_handler_make_args(aTHX_ &av_args, "Apache::Connection", c, NULL); break; - case MP_HANDLER_TYPE_FILE: + case MP_HANDLER_TYPE_FILES: { apr_pool_t *pconf, *plog, *ptemp; @@ -248,7 +248,7 @@ "Apache::Server", s, NULL); } break; - case MP_HANDLER_TYPE_PROC: + case MP_HANDLER_TYPE_PROCESS: { apr_pool_t *pconf; @@ -292,29 +292,31 @@ int modperl_per_dir_callback(int idx, request_rec *r) { -return modperl_run_handlers(idx, r, NULL, r->server, MP_HANDLER_TYPE_DIR); +return modperl_run_handlers(idx, r, NULL, r->server, +MP_HANDLER_TYPE_PER_DIR); } int modperl_per_srv_callback(int idx, request_rec *r) { -return modperl_run_handlers(idx, r, NULL, r->server, MP_HANDLER_TYPE_SRV); +return modperl_run_handlers(idx, r, NULL, r->server, +MP_HANDLER_TYPE_PER_SRV); } int modperl_connection_callback(int idx, conn_rec *c) { return modperl_run_handlers(idx, NULL, c, c->base_server, -MP_HANDLER_TYPE_CONN); +MP_HANDLER_TYPE_CONNECTION); } void modperl_process_callback(int idx, apr_pool_t *p, server_rec *s) { -modperl_run_handlers(idx, NULL, NULL, s, MP_HANDLER_TYPE_PROC, p); +modperl_run_handlers(idx, NULL, NULL, s, MP_HANDLER_TYPE_PROCESS, p); } void modperl_files_callback(int idx, apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) { -modperl_run_handlers(idx, NULL, NULL, s, MP_HANDLER_TYPE_FILE, +modperl_run_handlers(idx, NULL, NULL, s, MP_HANDLER_TYPE_FILES, pconf, plog, ptemp); } 1.13 +5 -5 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.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- modperl_callback.h2001/03/14 00:37:52 1.12 +++ modperl_callback.h2001/03/14 17:28:07 1.13 @@ -10,11 +10,11 @@ #define ap_hook_fixup ap_hook_fixups #define ap_hook_logap_hook_log_transaction -#define MP_HANDLER_TYPE_DIR 1 -#define MP_HANDLER_TYPE_SRV 2 -#define MP_HANDLER_TYPE_CONN 3 -#define MP_HANDLER_TYPE_PROC 4 -#define MP_HANDLER_TYPE_FILE 5 +#define MP_HANDLER_TYPE_PER_DIR1 +#define MP_HANDLER_TYPE_PER_SRV2 +#define MP_HAN
cvs commit: modperl-2.0/src/modules/perl modperl_callback.c modperl_callback.h modperl_filter.c
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 modperl_callback.h
dougm 01/02/18 13:55:08 Modified:src/modules/perl modperl_callback.c modperl_callback.h Log: avoid c++ keywords (class) Revision ChangesPath 1.17 +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.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- modperl_callback.c2001/02/08 19:42:02 1.16 +++ modperl_callback.c2001/02/18 21:55:08 1.17 @@ -87,7 +87,7 @@ } int modperl_handler_lookup(pTHX_ modperl_handler_t *handler, - char *class, char *name) + char *package, char *name) { CV *cv; GV *gv; 1.10 +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.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- modperl_callback.h2000/08/21 03:01:30 1.9 +++ modperl_callback.h2001/02/18 21:55:08 1.10 @@ -25,7 +25,7 @@ void modperl_handler_cache_cv(pTHX_ modperl_handler_t *handler, CV *cv); int modperl_handler_lookup(pTHX_ modperl_handler_t *handler, - char *class, char *name); + char *package, char *name); void modperl_handler_unparse(modperl_handler_t *handler);
cvs commit: modperl-2.0/src/modules/perl modperl_callback.c modperl_callback.h modperl_interp.c modperl_log.h modperl_tipool.c modperl_tipool.h modperl_types.h
dougm 00/05/26 13:34:51 Modified:src/modules/perl modperl_callback.c modperl_callback.h modperl_interp.c modperl_log.h modperl_tipool.c modperl_tipool.h modperl_types.h Log: don't cache get_cv() in the server config structure fixup max/min logic Revision ChangesPath 1.10 +18 -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.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- modperl_callback.c2000/05/01 23:57:52 1.9 +++ modperl_callback.c2000/05/26 20:34:49 1.10 @@ -223,11 +223,25 @@ return 0; } -int modperl_callback(pTHX_ modperl_handler_t *handler) +int modperl_callback(pTHX_ modperl_handler_t *handler, ap_pool_t *p) { dSP; int count, status; +#ifdef USE_ITHREADS +if (p) { +/* under ithreads, each handler needs to get_cv() from the + * selected interpreter so the proper CvPADLIST is used + * XXX: this should probably be reworked so threads can cache + * parsed handlers + */ +modperl_handler_t *new_handler = +modperl_handler_new(p, (void*)handler->name, +MP_HANDLER_TYPE_CHAR); +handler = new_handler; +} +#endif + if (!MpHandlerPARSED(handler)) { if (!modperl_handler_parse(aTHX_ handler)) { MP_TRACE_h(MP_FUNC, "failed to parse handler `%s'\n", @@ -278,12 +292,6 @@ status = HTTP_INTERNAL_SERVER_ERROR; } -/* XXX: since the interpreter from which this data was allocated - * can be knocked off (PerlInterpMax{Spare,Requests}, the parse caching - * is broken. - */ -modperl_handler_unparse(handler); - return status; } @@ -303,6 +311,7 @@ MP_dSCFG(s); MP_dDCFG; modperl_handler_t **handlers; +ap_pool_t *p = NULL; MpAV *av = NULL; int i, status = OK; const char *desc = NULL; @@ -338,6 +347,7 @@ #ifdef USE_ITHREADS if (r || c) { +p = c ? c->pool : r->pool; interp = modperl_interp_select(r, c, s); aTHX = interp->perl; } @@ -353,7 +363,7 @@ handlers = (modperl_handler_t **)av->elts; for (i=0; inelts; i++) { -status = modperl_callback(aTHX_ handlers[i]); +status = modperl_callback(aTHX_ handlers[i], p); MP_TRACE_h(MP_FUNC, "%s returned %d\n", handlers[i]->name, status); } 1.6 +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.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- modperl_callback.h2000/04/27 22:02:04 1.5 +++ modperl_callback.h2000/05/26 20:34:49 1.6 @@ -23,7 +23,7 @@ int modperl_handler_parse(pTHX_ modperl_handler_t *handler); -int modperl_callback(pTHX_ modperl_handler_t *handler); +int modperl_callback(pTHX_ modperl_handler_t *handler, ap_pool_t *p); void modperl_process_callback(int idx, ap_pool_t *p, server_rec *s); 1.13 +6 -3 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.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- modperl_interp.c 2000/05/23 20:54:44 1.12 +++ modperl_interp.c 2000/05/26 20:34:49 1.13 @@ -88,11 +88,13 @@ MP_TRACE_i(MP_FUNC, "selected 0x%lx (perl==0x%lx)\n", (unsigned long)interp, (unsigned long)interp->perl); -#ifdef _PTHREAD_H -MP_TRACE_i(MP_FUNC, "pthread_self == 0x%lx\n", - (unsigned long)pthread_self()); + +#ifdef MP_TRACE +interp->tid = MP_TIDF; #endif +MP_TRACE_i(MP_FUNC, "thread == 0x%lx\n", interp->tid); + MpInterpIN_USE_On(interp); return interp; @@ -117,6 +119,7 @@ static void *interp_pool_grow(modperl_tipool_t *tipool, void *data) { modperl_interp_pool_t *mip = (modperl_interp_pool_t *)data; +MP_TRACE_i(MP_FUNC, "adding new interpreter to the pool\n"); return (void *)modperl_interp_new(mip->ap_pool, mip, mip->parent->perl); } 1.3 +9 -0 modperl-2.0/src/modules/perl/modperl_log.h Index: modperl_log.h === RCS file: /home/cvs/modperl-2.0/src/modules/perl/modpe