dougm 01/03/14 00:22:51
Modified: src/modules/perl mod_perl.c modperl_config.c
modperl_config.h modperl_interp.c modperl_types.h
Log:
allow PerlInterpLifetime to be per-dir for subrequest and request lifetime
Revision Changes Path
1.32 +3 -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.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- mod_perl.c 2001/03/14 05:22:49 1.31
+++ mod_perl.c 2001/03/14 08:22:47 1.32
@@ -129,7 +129,7 @@
char *name = modperl_server_desc(s, p);
MP_TRACE_i(MP_FUNC, "PerlInterpLifetime set to %s for %s\n",
- modperl_interp_lifetime_desc(scfg), name);
+ modperl_interp_lifetime_desc(scfg->interp_lifetime), name);
#endif /* MP_TRACE */
if (scfg->mip->tipool->idle) {
@@ -220,8 +220,8 @@
"Min number of spare Perl interpreters"),
MP_SRV_CMD_TAKE1("PerlInterpMaxRequests", interp_max_requests,
"Max number of requests per Perl interpreters"),
- MP_SRV_CMD_TAKE1("PerlInterpLifetime", interp_lifetime,
- "Lifetime of a Perl interpreter (connection or request)"),
+ MP_DIR_CMD_TAKE1("PerlInterpLifetime", interp_lifetime,
+ "Lifetime of a Perl interpreter"),
#endif
MP_CMD_ENTRIES,
{ NULL },
1.20 +32 -7 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.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- modperl_config.c 2001/03/14 05:22:49 1.19
+++ modperl_config.c 2001/03/14 08:22:48 1.20
@@ -21,6 +21,12 @@
void *modperl_create_dir_config(apr_pool_t *p, char *dir)
{
modperl_dir_config_t *dcfg = modperl_dir_config_new(p);
+
+#ifdef USE_ITHREADS
+ /* defaults to per-server lifetime */
+ dcfg->interp_lifetime = MP_INTERP_LIFETIME_UNDEF;
+#endif
+
return dcfg;
}
@@ -226,31 +232,50 @@
#ifdef USE_ITHREADS
static const char *MP_interp_lifetime_desc[] = {
- "none", "request", "connection",
+ "undef", "subrequest", "request", "connection",
};
-const char *modperl_interp_lifetime_desc(modperl_srv_config_t *scfg)
+const char *modperl_interp_lifetime_desc(modperl_interp_lifetime_e lifetime)
{
- return MP_interp_lifetime_desc[scfg->interp_lifetime];
+ return MP_interp_lifetime_desc[lifetime];
}
+#define MP_INTERP_LIFETIME_OPTS "PerlInterpLifetime must be one of "
+
+#define MP_INTERP_LIFETIME_DIR_OPTS \
+MP_INTERP_LIFETIME_OPTS "subrequest or request"
+
+#define MP_INTERP_LIFETIME_SRV_OPTS \
+MP_INTERP_LIFETIME_OPTS "subrequest, request or connection"
+
MP_DECLARE_SRV_CMD(interp_lifetime)
{
+ modperl_interp_lifetime_e *lifetime;
+ modperl_dir_config_t *dcfg = (modperl_dir_config_t *)dummy;
MP_dSCFG(parms->server);
+ int is_per_dir = parms->path ? 1 : 0;
+
+ lifetime = is_per_dir ? &dcfg->interp_lifetime : &scfg->interp_lifetime;
switch (toLOWER(*arg)) {
+ case 's':
+ if (strcaseEQ(arg, "subrequest")) {
+ *lifetime = MP_INTERP_LIFETIME_SUBREQUEST;
+ break;
+ }
case 'r':
if (strcaseEQ(arg, "request")) {
- scfg->interp_lifetime = MP_INTERP_LIFETIME_REQUEST;
+ *lifetime = MP_INTERP_LIFETIME_REQUEST;
break;
}
case 'c':
- if (strcaseEQ(arg, "connection")) {
- scfg->interp_lifetime = MP_INTERP_LIFETIME_CONNECTION;
+ if (!is_per_dir && strcaseEQ(arg, "connection")) {
+ *lifetime = MP_INTERP_LIFETIME_CONNECTION;
break;
}
default:
- return "PerlInterpLifetime must be one of connection or request";
+ return is_per_dir ?
+ MP_INTERP_LIFETIME_DIR_OPTS : MP_INTERP_LIFETIME_SRV_OPTS;
};
return NULL;
1.19 +13 -3 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.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- modperl_config.h 2001/03/14 05:22:49 1.18
+++ modperl_config.h 2001/03/14 08:22:48 1.19
@@ -35,14 +35,20 @@
MP_DECLARE_SRV_CMD(interp_max_requests);
MP_DECLARE_SRV_CMD(interp_lifetime);
-const char *modperl_interp_lifetime_desc(modperl_srv_config_t *scfg);
+const char *modperl_interp_lifetime_desc(modperl_interp_lifetime_e lifetime);
-#define modperl_interp_lifetime_connection(scfg) \
-(scfg->interp_lifetime == MP_INTERP_LIFETIME_CONNECTION)
+#define modperl_interp_lifetime_undef(dcfg) \
+(dcfg->interp_lifetime == MP_INTERP_LIFETIME_UNDEF)
+#define modperl_interp_lifetime_subrequest(dcfg) \
+(dcfg->interp_lifetime == MP_INTERP_LIFETIME_SUBREQUEST)
+
#define modperl_interp_lifetime_request(scfg) \
(scfg->interp_lifetime == MP_INTERP_LIFETIME_REQUEST)
+#define modperl_interp_lifetime_connection(scfg) \
+(scfg->interp_lifetime == MP_INTERP_LIFETIME_CONNECTION)
+
#endif
#define MP_SRV_CMD_TAKE1(name, item, desc) \
@@ -52,6 +58,10 @@
#define MP_SRV_CMD_ITERATE(name, item, desc) \
AP_INIT_ITERATE( name, modperl_cmd_##item, NULL, \
RSRC_CONF, desc )
+
+#define MP_DIR_CMD_TAKE1(name, item, desc) \
+ AP_INIT_TAKE1( name, modperl_cmd_##item, NULL, \
+ OR_ALL, desc )
#define modperl_request_config_init(r, rcfg) \
if (!rcfg) { \
1.22 +22 -5 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.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- modperl_interp.c 2001/03/14 06:57:43 1.21
+++ modperl_interp.c 2001/03/14 08:22:48 1.22
@@ -206,15 +206,32 @@
server_rec *s)
{
MP_dSCFG(s);
+ modperl_dir_config_t *dcfg = modperl_dir_config_get(rr);
+ const char *desc = NULL;
modperl_interp_t *interp;
apr_pool_t *p = NULL;
+ request_rec *r = rr;
int is_subrequest = (rr && rr->main) ? 1 : 0;
- request_rec *r = is_subrequest ? rr->main : rr;
- const char *desc = NULL;
- int lifetime_connection =
- (modperl_interp_lifetime_connection(scfg) || !r);
+
+ /*
+ * if a per-dir PerlInterpLifetime is specified, use it.
+ * else if r != NULL use per-server PerlInterpLifetime
+ * else lifetime must be per-connection
+ */
+ modperl_interp_lifetime_e lifetime =
+ (dcfg && !modperl_interp_lifetime_undef(dcfg)) ?
+ dcfg->interp_lifetime :
+ (r ? scfg->interp_lifetime : MP_INTERP_LIFETIME_CONNECTION);
+
+ MP_TRACE_i(MP_FUNC, "lifetime is per-%s\n",
+ modperl_interp_lifetime_desc(lifetime));
+
+ if (is_subrequest && (lifetime == MP_INTERP_LIFETIME_REQUEST)) {
+ /* share 1 interpreter across sub-requests */
+ r = r->main;
+ }
- if (c && lifetime_connection) {
+ if (c && (lifetime == MP_INTERP_LIFETIME_CONNECTION)) {
desc = "conn_rec pool";
(void)apr_pool_userdata_get((void **)&interp, MP_INTERP_KEY, c->pool);
1.24 +5 -1 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.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- modperl_types.h 2001/03/14 05:22:50 1.23
+++ modperl_types.h 2001/03/14 08:22:48 1.24
@@ -110,7 +110,8 @@
} modperl_options_t;
typedef enum {
- MP_INTERP_LIFETIME_NONE,
+ MP_INTERP_LIFETIME_UNDEF,
+ MP_INTERP_LIFETIME_SUBREQUEST,
MP_INTERP_LIFETIME_REQUEST,
MP_INTERP_LIFETIME_CONNECTION,
} modperl_interp_lifetime_e;
@@ -144,6 +145,9 @@
MpHV *SetEnv;
MpHV *SetVars;
U8 flags;
+#ifdef USE_ITHREADS
+ modperl_interp_lifetime_e interp_lifetime;
+#endif
} modperl_dir_config_t;
typedef struct modperl_mgv_t modperl_mgv_t;