Author: torsten
Date: Tue Feb 7 19:50:47 2012
New Revision: 1241583
URL: http://svn.apache.org/viewvc?rev=1241583&view=rev
Log:
modperl_interp_pool_select() when used to create or merge dir-configs
at runtime may pull the interpreter from the wrong pool if the request's
server is a vhost with a separate interpreter pool.
Modified:
perl/modperl/branches/threading/Changes
perl/modperl/branches/threading/src/modules/perl/modperl_interp.c
Modified: perl/modperl/branches/threading/Changes
URL:
http://svn.apache.org/viewvc/perl/modperl/branches/threading/Changes?rev=1241583&r1=1241582&r2=1241583&view=diff
==============================================================================
--- perl/modperl/branches/threading/Changes (original)
+++ perl/modperl/branches/threading/Changes Tue Feb 7 19:50:47 2012
@@ -12,6 +12,12 @@ Also refer to the Apache::Test changes l
=item 2.0.6-threading
+Make sure modperl_interp_select uses r->server rather than the passed s
+parameter to find the interpreter pool to pull an interpreter from. This
+fixes an issue with vhosts with a separate interpreter pool and runtime
+dir-config merges that used to pull the interpreter from the wrong pool.
+[Torsten Foertsch]
+
PerlInterpScope is now more advisory. Using $(c|r)->pnotes will bind
the current interpreter to that object for it's lifetime.
$(c|r)->pnotes_kill() can be used to prematurely drop pnotes and
Modified: perl/modperl/branches/threading/src/modules/perl/modperl_interp.c
URL:
http://svn.apache.org/viewvc/perl/modperl/branches/threading/src/modules/perl/modperl_interp.c?rev=1241583&r1=1241582&r2=1241583&view=diff
==============================================================================
--- perl/modperl/branches/threading/src/modules/perl/modperl_interp.c (original)
+++ perl/modperl/branches/threading/src/modules/perl/modperl_interp.c Tue Feb
7 19:50:47 2012
@@ -399,14 +399,14 @@ modperl_interp_t *modperl_interp_pool_se
ap_assert(r);
MP_TRACE_i(MP_FUNC, "found userdata MODPERL_R in pool %#lx as %lx",
(unsigned long)r->pool, (unsigned long)r);
- return modperl_interp_select(r, NULL, s);
+ return modperl_interp_select(r, NULL, NULL);
}
}
modperl_interp_t *modperl_interp_select(request_rec *r, conn_rec *c,
server_rec *s)
{
- MP_dSCFG((s ? s : r ? r->server : NULL));
+ MP_dSCFG((r ? s=r->server : s ? s : NULL));
MP_dDCFG;
modperl_config_con_t *ccfg;
const char *desc = NULL;
@@ -443,7 +443,10 @@ modperl_interp_t *modperl_interp_select(
return ccfg->interp;
}
- interp = modperl_interp_get(s ? s : r->server);
+ MP_TRACE_i(MP_FUNC,
+ "fetching interp for (%s:%d)", s->server_hostname, s->port);
+ interp = modperl_interp_get(s);
+ MP_TRACE_i(MP_FUNC, " --> got %pp", interp);
++interp->num_requests; /* should only get here once per request */
interp->refcnt = 0;