dougm 00/06/11 20:30:59
Modified: lib/ModPerl Code.pm
src/modules/perl mod_perl.c modperl_config.c
modperl_interp.c
Log:
allow VirtualHosts to have their own PerlInterpreter and/or mip
Revision Changes Path
1.27 +3 -2 modperl-2.0/lib/ModPerl/Code.pm
Index: Code.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/lib/ModPerl/Code.pm,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- Code.pm 2000/06/09 04:30:42 1.26
+++ Code.pm 2000/06/12 03:30:50 1.27
@@ -82,9 +82,10 @@
}
my %flags = (
- Srv => [qw(NONE PERL_TAINT_CHECK PERL_WARN FRESH_RESTART)],
+ Srv => [qw(NONE PERL_TAINT_CHECK PERL_WARN FRESH_RESTART
+ PERL_CLONE PERL_ALLOC)],
Dir => [qw(NONE INCPUSH SENDHDR SENTHDR ENV CLEANUP RCLEANUP)],
- Interp => [qw(NONE IN_USE PUTBACK CLONED)],
+ Interp => [qw(NONE IN_USE PUTBACK CLONED BASE)],
Handler => [qw(NONE PARSED METHOD OBJECT ANON)],
);
1.15 +51 -3 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.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- mod_perl.c 2000/05/23 20:54:44 1.14
+++ mod_perl.c 2000/06/12 03:30:51 1.15
@@ -1,6 +1,6 @@
#include "mod_perl.h"
-void modperl_startup(server_rec *s, ap_pool_t *p)
+PerlInterpreter *modperl_startup(server_rec *s, ap_pool_t *p)
{
MP_dSCFG(s);
PerlInterpreter *perl;
@@ -39,12 +39,60 @@
);
#endif
- modperl_interp_init(s, p, perl);
+ return perl;
}
void modperl_init(server_rec *s, ap_pool_t *p)
{
- modperl_startup(s, p);
+ server_rec *base_server = s;
+ server_rec *srvp;
+ PerlInterpreter *base_perl = modperl_startup(base_server, p);
+ modperl_interp_init(base_server, p, base_perl);
+
+ {
+ MP_dSCFG(base_server);
+ MpInterpBASE_On(scfg->mip->parent);
+ }
+
+ for (srvp=base_server->next; srvp; srvp=srvp->next) {
+ MP_dSCFG(srvp);
+ PerlInterpreter *perl = base_perl;
+
+ if (1) {
+ /* XXX: using getenv() just for testing here */
+ char *do_alloc = getenv("MP_SRV_ALLOC_TEST");
+ char *do_clone = getenv("MP_SRV_CLONE_TEST");
+ if (do_alloc && strEQ(do_alloc, srvp->server_hostname)) {
+ MpSrvPERL_ALLOC_On(scfg);
+ }
+ if (do_clone && strEQ(do_clone, srvp->server_hostname)) {
+ MpSrvPERL_CLONE_On(scfg);
+ }
+ }
+
+ /* if alloc flags is On, virtual host gets its own parent perl */
+ if (MpSrvPERL_ALLOC(scfg)) {
+ perl = modperl_startup(srvp, p);
+ MP_TRACE_i(MP_FUNC, "modperl_startup() server=%s\n",
+ srvp->server_hostname);
+ }
+
+#ifdef USE_ITHREADS
+ /* if alloc flags is On or clone flag is On,
+ * virtual host gets its own mip
+ */
+ if (MpSrvPERL_ALLOC(scfg) || MpSrvPERL_CLONE(scfg)) {
+ MP_TRACE_i(MP_FUNC, "modperl_interp_init() server=%s\n",
+ srvp->server_hostname);
+ modperl_interp_init(srvp, p, perl);
+ }
+
+ /* if we allocated a parent perl, mark it to be destroyed */
+ if (MpSrvPERL_ALLOC(scfg)) {
+ MpInterpBASE_On(scfg->mip->parent);
+ }
+#endif
+ }
}
void modperl_hook_init(ap_pool_t *pconf, ap_pool_t *plog,
1.11 +20 -6 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.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- modperl_config.c 2000/05/23 20:54:44 1.10
+++ modperl_config.c 2000/06/12 03:30:52 1.11
@@ -136,19 +136,36 @@
#define merge_item(item) \
mrg->item = add->item ? add->item : base->item
+/* XXX: this is not complete */
void *modperl_merge_srv_config(ap_pool_t *p, void *basev, void *addv)
{
-#if 0
modperl_srv_config_t
*base = (modperl_srv_config_t *)basev,
*add = (modperl_srv_config_t *)addv,
*mrg = modperl_srv_config_new(p);
-#endif
MP_TRACE_d(MP_FUNC, "basev==0x%lx, addv==0x%lx\n",
(unsigned long)basev, (unsigned long)addv);
+
+#ifdef USE_ITHREADS
+ merge_item(mip);
+ merge_item(interp_pool_cfg);
+#else
+ merge_item(perl);
+#endif
- return addv;
+ merge_item(files_cfg);
+ merge_item(process_cfg);
+ merge_item(connection_cfg);
+
+ { /* XXX: should do a proper merge of the arrays */
+ int i;
+ for (i=0; i<MP_PER_SRV_NUM_HANDLERS; i++) {
+ merge_item(handlers[i]);
+ }
+ }
+
+ return mrg;
}
#define MP_CONFIG_BOOTSTRAP(parms) \
@@ -174,7 +191,6 @@
MP_DECLARE_SRV_CMD(switches)
{
MP_dSCFG(parms->server);
- MP_SRV_CMD_CHECK;
scfg_push_argv(arg);
return NULL;
}
@@ -187,8 +203,6 @@
{ \
MP_dSCFG(parms->server); \
int item = atoi(arg); \
- const char *err = ap_check_cmd_context(parms, GLOBAL_ONLY); \
- if (err) return err; \
scfg->interp_pool_cfg->##item = item; \
MP_TRACE_d(MP_FUNC, "%s %d\n", parms->cmd->name, item); \
return NULL; \
1.15 +9 -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.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- modperl_interp.c 2000/05/28 01:44:47 1.14
+++ modperl_interp.c 2000/06/12 03:30:56 1.15
@@ -106,10 +106,16 @@
modperl_tipool_destroy(mip->tipool);
mip->tipool = NULL;
- MP_TRACE_i(MP_FUNC, "parent == 0x%lx\n",
- (unsigned long)mip->parent);
+ if (MpInterpBASE(mip->parent)) {
+ /* multiple mips might share the same parent
+ * make sure its only destroyed once
+ */
+ MP_TRACE_i(MP_FUNC, "parent == 0x%lx\n",
+ (unsigned long)mip->parent);
- modperl_interp_destroy(mip->parent);
+ modperl_interp_destroy(mip->parent);
+ }
+
mip->parent->perl = NULL;
return APR_SUCCESS;