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 Changes Path 1.35 +38 -51 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.34 retrieving revision 1.35 diff -u -r1.34 -r1.35 --- modperl_callback.c 2001/03/16 06:57:42 1.34 +++ modperl_callback.c 2001/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, - r->server, - MP_HANDLER_TYPE_PER_SRV); + return modperl_callback_run_handlers(idx, MP_HANDLER_TYPE_PER_SRV, + r, NULL, r->server, + NULL, NULL, NULL); } int modperl_callback_connection(int idx, conn_rec *c) { - return modperl_callback_run_handlers(idx, NULL, c, - c->base_server, - MP_HANDLER_TYPE_CONNECTION); + return modperl_callback_run_handlers(idx, MP_HANDLER_TYPE_CONNECTION, + NULL, c, c->base_server, + NULL, NULL, NULL); } void modperl_callback_process(int idx, apr_pool_t *p, server_rec *s) { - modperl_callback_run_handlers(idx, NULL, NULL, s, - MP_HANDLER_TYPE_PROCESS, p); + modperl_callback_run_handlers(idx, MP_HANDLER_TYPE_PROCESS, + NULL, NULL, s, + p, NULL, NULL); } void modperl_callback_files(int idx, apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) { - modperl_callback_run_handlers(idx, NULL, NULL, s, - MP_HANDLER_TYPE_FILES, + modperl_callback_run_handlers(idx, MP_HANDLER_TYPE_FILES, + NULL, NULL, s, pconf, plog, ptemp); } 1.18 +5 -2 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.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- modperl_callback.h 2001/03/16 05:08:15 1.17 +++ modperl_callback.h 2001/03/16 17:23:24 1.18 @@ -13,8 +13,11 @@ int modperl_callback(pTHX_ modperl_handler_t *handler, apr_pool_t *p, server_rec *s, AV *args); -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); int modperl_callback_per_dir(int idx, request_rec *r); 1.5 +13 -8 modperl-2.0/src/modules/perl/modperl_handler.c Index: modperl_handler.c =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_handler.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- modperl_handler.c 2001/03/16 07:30:22 1.4 +++ modperl_handler.c 2001/03/16 17:23:24 1.5 @@ -67,33 +67,38 @@ MpAV **modperl_handler_lookup_handlers(modperl_config_dir_t *dcfg, modperl_config_srv_t *scfg, modperl_config_req_t *rcfg, - int type, int idx, + apr_pool_t *p, + int type, int idx, int lvalue, const char **desc) { - MpAV *av = NULL; + MpAV **avp = NULL; switch (type) { case MP_HANDLER_TYPE_PER_DIR: - av = dcfg->handlers_per_dir[idx]; + avp = &dcfg->handlers_per_dir[idx]; set_desc(per_dir); break; case MP_HANDLER_TYPE_PER_SRV: - av = scfg->handlers_per_srv[idx]; + avp = &scfg->handlers_per_srv[idx]; set_desc(per_srv); break; case MP_HANDLER_TYPE_CONNECTION: - av = scfg->handlers_connection[idx]; + avp = &scfg->handlers_connection[idx]; set_desc(connection); break; case MP_HANDLER_TYPE_FILES: - av = scfg->handlers_files[idx]; + avp = &scfg->handlers_files[idx]; set_desc(files); break; case MP_HANDLER_TYPE_PROCESS: - av = scfg->handlers_process[idx]; + avp = &scfg->handlers_process[idx]; set_desc(process); break; }; - return av ? &av : NULL; + if (lvalue && avp && !*avp && p) { + *avp = apr_array_make(p, lvalue, sizeof(modperl_handler_t *)); + } + + return avp; } 1.4 +2 -1 modperl-2.0/src/modules/perl/modperl_handler.h Index: modperl_handler.h =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_handler.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- modperl_handler.h 2001/03/16 06:41:46 1.3 +++ modperl_handler.h 2001/03/16 17:23:25 1.4 @@ -11,7 +11,8 @@ MpAV **modperl_handler_lookup_handlers(modperl_config_dir_t *dcfg, modperl_config_srv_t *scfg, modperl_config_req_t *rcfg, - int type, int idx, + apr_pool_t *p, + int type, int idx, int lvalue, const char **desc); #endif /* MODPERL_HANDLER_H */ 1.29 +6 -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.28 retrieving revision 1.29 diff -u -r1.28 -r1.29 --- modperl_types.h 2001/03/16 07:30:23 1.28 +++ modperl_types.h 2001/03/16 17:23:25 1.29 @@ -196,6 +196,12 @@ typedef struct { HV *pnotes; modperl_wbucket_t wbucket; + MpAV *handlers_per_dir[MP_HANDLER_NUM_PER_DIR]; + MpAV *handlers_per_srv[MP_HANDLER_NUM_PER_SRV]; } modperl_config_req_t; + +typedef struct { + MpAV *handlers_connection[MP_HANDLER_NUM_CONNECTION]; +} modperl_config_con_t; #endif /* MODPERL_TYPES_H */