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 */