dougm 00/04/15 17:35:32 Modified: src/modules/perl mod_perl.c mod_perl.h modperl_config.c modperl_config.h modperl_interp.c modperl_types.h Log: add PerlInterp* and PerlTrace config directives Revision Changes Path 1.5 +20 -5 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.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- mod_perl.c 2000/04/15 23:00:46 1.4 +++ mod_perl.c 2000/04/16 00:35:32 1.5 @@ -26,13 +26,17 @@ modperl_interp_pool_init(s, p, perl); } -void modperl_init(ap_pool_t *pconf, ap_pool_t *plog, - ap_pool_t *ptemp, server_rec *s) +void modperl_init(server_rec *s, ap_pool_t *p) { - modperl_trace_level_set("all"); /* XXX: all for now */ - modperl_startup(s, pconf); + modperl_startup(s, p); } +void modperl_hook_init(ap_pool_t *pconf, ap_pool_t *plog, + ap_pool_t *ptemp, server_rec *s) +{ + modperl_init(s, pconf); +} + void modperl_pre_config_handler(ap_pool_t *p, ap_pool_t *plog, ap_pool_t *ptemp) { @@ -41,7 +45,7 @@ void modperl_register_hooks(void) { /* XXX: should be pre_config hook or 1.xx logic */ - ap_hook_open_logs(modperl_init, NULL, NULL, HOOK_MIDDLE); + ap_hook_open_logs(modperl_hook_init, NULL, NULL, HOOK_MIDDLE); /* XXX: should only bother selecting an interpreter * if one is needed for the request @@ -50,6 +54,17 @@ } static command_rec modperl_cmds[] = { +#ifdef MP_TRACE + MP_SRV_CMD_TAKE1("PerlTrace", trace, "Trace level"), +#endif + MP_SRV_CMD_TAKE1("PerlInterpStart", interp_start, + "Number of Perl interpreters to start"), + MP_SRV_CMD_TAKE1("PerlInterpMax", interp_max, + "Max number of running Perl interpreters"), + MP_SRV_CMD_TAKE1("PerlInterpMaxSpare", interp_max_spare, + "Max number of spare Perl interpreters"), + MP_SRV_CMD_TAKE1("PerlInterpMinSpare", interp_min_spare, + "Min number of spare Perl interpreters"), { NULL }, }; 1.5 +2 -0 modperl-2.0/src/modules/perl/mod_perl.h Index: mod_perl.h =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/mod_perl.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- mod_perl.h 2000/04/15 23:00:46 1.4 +++ mod_perl.h 2000/04/16 00:35:32 1.5 @@ -32,4 +32,6 @@ #include "modperl_directives.h" +void modperl_init(server_rec *s, ap_pool_t *p); + #endif /* MOD_PERL_H */ 1.2 +39 -1 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.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- modperl_config.c 2000/04/15 23:00:47 1.1 +++ modperl_config.c 2000/04/16 00:35:32 1.2 @@ -19,10 +19,22 @@ void *modperl_create_srv_config(ap_pool_t *p, server_rec *s) { modperl_srv_config_t *scfg = modperl_srv_config_new(p); + scfg->interp_pool_cfg = + (modperl_interp_pool_config_t *) + ap_pcalloc(p, sizeof(*scfg->interp_pool_cfg)); + /* XXX: determine reasonable defaults */ + scfg->interp_pool_cfg->start = 3; + scfg->interp_pool_cfg->max_spare = 3; + scfg->interp_pool_cfg->min_spare = 3; + scfg->interp_pool_cfg->max = 5; + return scfg; } +#define merge_item(item) \ +mrg->item = add->item ? add->item : base->item + void *modperl_merge_srv_config(ap_pool_t *p, void *basev, void *addv) { modperl_srv_config_t @@ -30,7 +42,33 @@ *add = (modperl_srv_config_t *)addv, *mrg = modperl_srv_config_new(p); - mrg->mip = add->mip ? add->mip : base->mip; + merge_item(mip); return mrg; } + +#define MP_CONFIG_BOOTSTRAP(parms) \ +if (!scfg->mip) modperl_init(parms->server, parms->pool) + +MP_DECLARE_SRV_CMD(trace) +{ + modperl_trace_level_set(arg); + return NULL; +} + + +#define MP_IMP_INTERP_POOL_CFG(item) \ +const char *modperl_cmd_interp_##item(cmd_parms *parms, \ + void *dummy, char *arg) \ +{ \ + MP_dSCFG(parms->server); \ + int item = atoi(arg); \ + scfg->interp_pool_cfg->##item = item; \ + MP_TRACE_d(MP_FUNC, "%s %d\n", parms->cmd->name, item); \ + return NULL; \ +} + +MP_IMP_INTERP_POOL_CFG(start); +MP_IMP_INTERP_POOL_CFG(max); +MP_IMP_INTERP_POOL_CFG(max_spare); +MP_IMP_INTERP_POOL_CFG(min_spare); 1.4 +14 -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.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- modperl_config.h 2000/04/15 23:00:47 1.3 +++ modperl_config.h 2000/04/16 00:35:32 1.4 @@ -13,6 +13,20 @@ char *modperl_cmd_push_handlers(MpAV *handlers, char *name, ap_pool_t *p); +#define MP_DECLARE_SRV_CMD(item) \ +const char *modperl_cmd_##item(cmd_parms *parms, \ + void *dummy, char *arg) +MP_DECLARE_SRV_CMD(trace); + +MP_DECLARE_SRV_CMD(interp_start); +MP_DECLARE_SRV_CMD(interp_max); +MP_DECLARE_SRV_CMD(interp_max_spare); +MP_DECLARE_SRV_CMD(interp_min_spare); + +#define MP_SRV_CMD_TAKE1(name, item, desc) \ + { name, modperl_cmd_##item, NULL, \ + RSRC_CONF, TAKE1, desc } + #define MP_dRCFG \ modperl_request_config_t *rcfg = \ (modperl_request_config_t *) \ 1.5 +8 -10 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.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- modperl_interp.c 2000/04/15 22:43:10 1.4 +++ modperl_interp.c 2000/04/16 00:35:32 1.5 @@ -67,7 +67,7 @@ MUTEX_LOCK(&mip->mip_lock); if (mip->size == mip->in_use) { - if (mip->size < mip->max) { + if (mip->size < mip->cfg->max) { interp = modperl_interp_new(mip->ap_pool, mip, mip->parent->perl); MUTEX_UNLOCK(&mip->mip_lock); @@ -211,6 +211,7 @@ int i; mip->ap_pool = p; + mip->cfg = scfg->interp_pool_cfg; mip->parent = modperl_interp_new(p, mip, NULL); aTHX = mip->parent->perl = perl; @@ -218,11 +219,7 @@ COND_INIT(&mip->available); #ifdef USE_ITHREADS - mip->start = 3; /*XXX*/ - mip->max = 4; - mip->max_spare = 3; - - for (i=0; i<mip->start; i++) { + for (i=0; i<mip->cfg->start; i++) { modperl_interp_t *interp = modperl_interp_new(p, mip, perl); modperl_interp_pool_add(mip, interp); @@ -232,7 +229,8 @@ MP_TRACE_i(MP_FUNC, "parent == 0x%lx " "start=%d, max=%d, min_spare=%d, max_spare=%d\n", (unsigned long)mip->parent, - mip->max, mip->start, mip->min_spare, mip->max_spare); + mip->cfg->start, mip->cfg->max, + mip->cfg->min_spare, mip->cfg->max_spare); ap_register_cleanup(p, (void*)mip, modperl_interp_pool_destroy, ap_null_cleanup); @@ -254,13 +252,13 @@ MP_TRACE_i(MP_FUNC, "0x%lx now available (%d in use, %d running)\n", (unsigned long)interp, mip->in_use, mip->size); - if (mip->in_use == (mip->max - 1)) { + if (mip->in_use == (mip->cfg->max - 1)) { MP_TRACE_i(MP_FUNC, "broadcast available\n"); COND_SIGNAL(&mip->available); } - else if (mip->size > mip->max_spare) { + else if (mip->size > mip->cfg->max_spare) { MP_TRACE_i(MP_FUNC, "throttle down (max_spare=%d, %d running)\n", - mip->max_spare, mip->size); + mip->cfg->max_spare, mip->size); MUTEX_UNLOCK(&mip->mip_lock); modperl_interp_pool_remove(mip, interp); modperl_interp_destroy(interp); 1.4 +10 -5 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.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- modperl_types.h 2000/04/15 22:43:10 1.3 +++ modperl_types.h 2000/04/16 00:35:32 1.4 @@ -26,6 +26,13 @@ typedef struct modperl_interp_t modperl_interp_t; typedef struct modperl_interp_pool_t modperl_interp_pool_t; +typedef struct { + int start; /* number of Perl intepreters to start (clone) */ + int min_spare; /* minimum number of spare Perl interpreters */ + int max_spare; /* maximum number of spare Perl interpreters */ + int max; /* maximum number of Perl interpreters */ +} modperl_interp_pool_config_t; + struct modperl_interp_t { modperl_interp_pool_t *mip; PerlInterpreter *perl; @@ -37,12 +44,9 @@ ap_pool_t *ap_pool; perl_mutex mip_lock; perl_cond available; - int start; /* number of Perl intepreters to start (clone) */ - int min_spare; /* minimum number of spare Perl interpreters */ - int max_spare; /* maximum number of spare Perl interpreters */ - int size; /* current number of Perl interpreters */ - int max; /* maximum number of Perl interpreters */ + modperl_interp_pool_config_t *cfg; int in_use; /* number of Perl interpreters currrently in use */ + int size; /* current number of Perl interpreters */ modperl_interp_t *parent; /* from which to perl_clone() */ modperl_interp_t *head, *tail; }; @@ -67,6 +71,7 @@ modperl_process_config_t *process_cfg; modperl_connection_config_t *connection_cfg; modperl_interp_pool_t *mip; + modperl_interp_pool_config_t *interp_pool_cfg; int flags; } modperl_srv_config_t;