Author: stevehay
Date: Fri Nov 1 00:03:16 2013
New Revision: 1537772
URL: http://svn.apache.org/r1537772
Log:
Merged revision(s) 1075807, 1241583, 1241983-1241984, 1241987, 1242010,
1242050, 1242068 from perl/modperl/branches/threading:
reintroduce MP_dTHX macro
........
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.
........
improve MP_TRACE output a bit: include current perl context for
threaded perls
........
rename assert() => ap_assert()
........
similar to r1241583: make sure r->server is used to identify the interpreter
pool to pull from at runtime.
........
comment added
........
remove a bit of code complexity
modperl_module.c contains these 2 lines:
interp = modperl_interp_pool_select(p, s);
MP_PERL_CONTEXT_STORE_OVERRIDE(interp->perl);
The latter decodes as
orig_perl = PERL_GET_CONTEXT;
aTHX = interp->perl;
PERL_SET_CONTEXT(aTHX);
Now, modperl_interp_pool_select() already calls PERL_SET_CONTEXT with the
newly allocated interpreter. So, we get
PERL_SET_CONTEXT(interp->perl);
orig_perl = PERL_GET_CONTEXT;
aTHX = interp->perl;
PERL_SET_CONTEXT(aTHX);
But this is the same as
interp = modperl_interp_pool_select(p, s);
aTHX = interp->perl;
........
ap_assert => MP_ASSERT (depends on MP_DEBUG)
........
Modified:
perl/modperl/branches/httpd24threading/ (props changed)
perl/modperl/branches/httpd24threading/Changes
perl/modperl/branches/httpd24threading/src/modules/perl/mod_perl.c
perl/modperl/branches/httpd24threading/src/modules/perl/modperl_common_log.c
perl/modperl/branches/httpd24threading/src/modules/perl/modperl_config.h
perl/modperl/branches/httpd24threading/src/modules/perl/modperl_debug.h
perl/modperl/branches/httpd24threading/src/modules/perl/modperl_interp.c
perl/modperl/branches/httpd24threading/src/modules/perl/modperl_module.c
perl/modperl/branches/httpd24threading/src/modules/perl/modperl_svptr_table.c
Propchange: perl/modperl/branches/httpd24threading/
------------------------------------------------------------------------------
Merged
/perl/modperl/branches/threading:r1075807,1241583,1241983-1241984,1241987,1242010,1242050,1242068
Modified: perl/modperl/branches/httpd24threading/Changes
URL:
http://svn.apache.org/viewvc/perl/modperl/branches/httpd24threading/Changes?rev=1537772&r1=1537771&r2=1537772&view=diff
==============================================================================
--- perl/modperl/branches/httpd24threading/Changes (original)
+++ perl/modperl/branches/httpd24threading/Changes Fri Nov 1 00:03:16 2013
@@ -12,6 +12,12 @@ Also refer to the Apache::Test changes l
=item 2.0.9-dev
+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/httpd24threading/src/modules/perl/mod_perl.c
URL:
http://svn.apache.org/viewvc/perl/modperl/branches/httpd24threading/src/modules/perl/mod_perl.c?rev=1537772&r1=1537771&r2=1537772&view=diff
==============================================================================
--- perl/modperl/branches/httpd24threading/src/modules/perl/mod_perl.c
(original)
+++ perl/modperl/branches/httpd24threading/src/modules/perl/mod_perl.c Fri Nov
1 00:03:16 2013
@@ -742,11 +742,17 @@ static int modperl_hook_create_request(r
MP_dRCFG;
#ifdef USE_ITHREADS
- if (modperl_threaded_mpm()) {
- MP_TRACE_i(MP_FUNC, "setting userdata MODPERL_R in pool %#lx to %lx",
- (unsigned long)r->pool, (unsigned long)r);
- (void)apr_pool_userdata_set((void *)r, "MODPERL_R", NULL, r->pool);
- }
+ /* XXX: this is necessary to make modperl_interp_pool_select() work
+ * which is used at runtime only to merge dir-configs by
+ * modperl_module_config_merge().
+ *
+ * Since most requests won't need it it would be good to add some logic
+ * (cheaper logic in terms of CPU cycles) to identify those cases and
+ * avoid the hash operation.
+ */
+ MP_TRACE_i(MP_FUNC, "setting userdata MODPERL_R in pool %#lx to %lx",
+ (unsigned long)r->pool, (unsigned long)r);
+ (void)apr_pool_userdata_set((void *)r, "MODPERL_R", NULL, r->pool);
#endif
modperl_config_req_init(r, rcfg);
Modified:
perl/modperl/branches/httpd24threading/src/modules/perl/modperl_common_log.c
URL:
http://svn.apache.org/viewvc/perl/modperl/branches/httpd24threading/src/modules/perl/modperl_common_log.c?rev=1537772&r1=1537771&r2=1537772&view=diff
==============================================================================
---
perl/modperl/branches/httpd24threading/src/modules/perl/modperl_common_log.c
(original)
+++
perl/modperl/branches/httpd24threading/src/modules/perl/modperl_common_log.c
Fri Nov 1 00:03:16 2013
@@ -49,14 +49,27 @@ void modperl_trace(const char *func, con
return;
}
+ /* for more information on formatting codes see
+
http://apr.apache.org/docs/apr/1.4/group__apr__lib.html#gad2cd3594aeaafd45931d1034965f48c1
+ */
if (modperl_threaded_mpm()) {
- apr_file_printf(logfile, "[%lu/%lu] ", (unsigned long)getpid(),
- modperl_threads_started()
- ? (unsigned long)apr_os_thread_current()
- : 0);
+ if (modperl_threads_started()) {
+ apr_file_printf(logfile, "[pid=%lu, tid=%pt, perl=%pp] ",
+ (unsigned long)getpid(),
+ (void*)apr_os_thread_current(), PERL_GET_CONTEXT);
+ }
+ else {
+ apr_file_printf(logfile, "[pid=%lu, perl=%pp] ",
+ (unsigned long)getpid(), PERL_GET_CONTEXT);
+ }
}
else {
- apr_file_printf(logfile, "[%lu] ", (unsigned long)getpid());
+#ifdef USE_ITHREADS
+ apr_file_printf(logfile, "[pid=%lu, perl=%pp] ",
+ (unsigned long)getpid(), PERL_GET_CONTEXT);
+#else
+ apr_file_printf(logfile, "[pid=%lu] ", (unsigned long)getpid());
+#endif
}
if (func && *func) {
Modified:
perl/modperl/branches/httpd24threading/src/modules/perl/modperl_config.h
URL:
http://svn.apache.org/viewvc/perl/modperl/branches/httpd24threading/src/modules/perl/modperl_config.h?rev=1537772&r1=1537771&r2=1537772&view=diff
==============================================================================
--- perl/modperl/branches/httpd24threading/src/modules/perl/modperl_config.h
(original)
+++ perl/modperl/branches/httpd24threading/src/modules/perl/modperl_config.h
Fri Nov 1 00:03:16 2013
@@ -36,7 +36,7 @@ void *modperl_config_srv_merge(apr_pool_
char **modperl_config_srv_argv_init(modperl_config_srv_t *scfg, int *argc);
#define modperl_config_srv_argv_push(arg) \
- *(const char **)apr_array_push(scfg->argv) = arg
+ *(const char **)apr_array_push(scfg->argv) = (arg)
apr_status_t modperl_config_request_cleanup(pTHX_ request_rec *r);
@@ -49,9 +49,9 @@ apr_status_t modperl_config_req_cleanup(
#define modperl_config_req_cleanup_register(r, rcfg) \
if (r && !MpReqCLEANUP_REGISTERED(rcfg)) { \
apr_pool_t *p; \
- apr_pool_create(&p, r->pool); \
+ apr_pool_create(&p, (r)->pool); \
apr_pool_cleanup_register(p, \
- (void*)r, \
+ (void*)(r), \
modperl_config_req_cleanup, \
apr_pool_cleanup_null); \
MpReqCLEANUP_REGISTERED_On(rcfg); \
@@ -64,25 +64,25 @@ void modperl_set_perl_module_config(ap_c
# define modperl_get_module_config(v) \
modperl_get_perl_module_config(v)
-# define modperl_set_module_config(v, c) \
- modperl_set_perl_module_config(v, c)
+# define modperl_set_module_config((v), c) \
+ modperl_set_perl_module_config((v), (c))
#else
# define modperl_get_module_config(v) \
- ap_get_module_config(v, &perl_module)
+ ap_get_module_config((v), &perl_module)
# define modperl_set_module_config(v, c) \
- ap_set_module_config(v, &perl_module, c)
+ ap_set_module_config((v), &perl_module, (c))
#endif
#define modperl_config_req_init(r, rcfg) \
- if (!rcfg) { \
- rcfg = modperl_config_req_new(r); \
- modperl_set_module_config(r->request_config, rcfg); \
+ if (!(rcfg)) { \
+ (rcfg) = modperl_config_req_new(r); \
+ modperl_set_module_config((r)->request_config, (rcfg)); \
}
#define modperl_config_req_get(r) \
(r ? (modperl_config_req_t *) \
- modperl_get_module_config(r->request_config) : NULL)
+ modperl_get_module_config((r)->request_config) : NULL)
#define MP_dRCFG \
modperl_config_req_t *rcfg = modperl_config_req_get(r)
@@ -90,23 +90,23 @@ void modperl_set_perl_module_config(ap_c
#define modperl_config_con_init(c, ccfg) \
if (!ccfg) { \
ccfg = modperl_config_con_new(c); \
- modperl_set_module_config(c->conn_config, ccfg); \
+ modperl_set_module_config((c)->conn_config, (ccfg)); \
}
#define modperl_config_con_get(c) \
(c ? (modperl_config_con_t *) \
- modperl_get_module_config(c->conn_config) : NULL)
+ modperl_get_module_config((C)->conn_config) : NULL)
#define MP_dCCFG \
modperl_config_con_t *ccfg = modperl_config_con_get(c)
#define modperl_config_dir_get(r) \
(r ? (modperl_config_dir_t *) \
- modperl_get_module_config(r->per_dir_config) : NULL)
+ modperl_get_module_config((r)->per_dir_config) : NULL)
#define modperl_config_dir_get_defaults(s) \
(modperl_config_dir_t *) \
- modperl_get_module_config(s->lookup_defaults)
+ modperl_get_module_config((s)->lookup_defaults)
#define MP_dDCFG \
modperl_config_dir_t *dcfg = modperl_config_dir_get(r)
@@ -132,8 +132,10 @@ void modperl_set_perl_module_config(ap_c
modperl_interp_t *interp = \
modperl_interp_select(r, r->connection, r->server); \
dTHXa(interp->perl)
+# define MP_uTHX modperl_interp_unselect(interp)
#else
# define MP_dTHX dNOOP
+# define MP_uTHX dNOOP
#endif
int modperl_config_apply_PerlModule(server_rec *s,
Modified:
perl/modperl/branches/httpd24threading/src/modules/perl/modperl_debug.h
URL:
http://svn.apache.org/viewvc/perl/modperl/branches/httpd24threading/src/modules/perl/modperl_debug.h?rev=1537772&r1=1537771&r2=1537772&view=diff
==============================================================================
--- perl/modperl/branches/httpd24threading/src/modules/perl/modperl_debug.h
(original)
+++ perl/modperl/branches/httpd24threading/src/modules/perl/modperl_debug.h Fri
Nov 1 00:03:16 2013
@@ -19,6 +19,12 @@
#include "mod_perl.h"
+#ifdef MP_DEBUG
+#define MP_ASSERT(exp) ap_assert(exp)
+#else
+#define MP_ASSERT(exp) ((void)0)
+#endif
+
char *modperl_server_desc(server_rec *s, apr_pool_t *p);
#ifdef MP_TRACE
Modified:
perl/modperl/branches/httpd24threading/src/modules/perl/modperl_interp.c
URL:
http://svn.apache.org/viewvc/perl/modperl/branches/httpd24threading/src/modules/perl/modperl_interp.c?rev=1537772&r1=1537771&r2=1537772&view=diff
==============================================================================
--- perl/modperl/branches/httpd24threading/src/modules/perl/modperl_interp.c
(original)
+++ perl/modperl/branches/httpd24threading/src/modules/perl/modperl_interp.c
Fri Nov 1 00:03:16 2013
@@ -285,7 +285,7 @@ apr_status_t modperl_interp_unselect(voi
if (interp == mip->parent) return APR_SUCCESS;
- ap_assert(interp && MpInterpIN_USE(interp));
+ MP_ASSERT(interp && MpInterpIN_USE(interp));
MP_TRACE_i(MP_FUNC, "unselect(interp=0x%lx): refcnt=%d",
(unsigned long)interp, interp->refcnt);
if (interp->refcnt != 0) {
@@ -345,10 +345,10 @@ modperl_interp_t *modperl_interp_pool_se
server_rec *s)
{
int is_startup = (p == s->process->pconf);
- MP_dSCFG(s);
modperl_interp_t *interp = NULL;
if (is_startup) {
+ MP_dSCFG(s);
if (scfg) {
MP_TRACE_i(MP_FUNC, "using parent interpreter at startup");
@@ -389,31 +389,20 @@ modperl_interp_t *modperl_interp_pool_se
return interp;
}
- else if (!modperl_threaded_mpm()) {
- MP_TRACE_i(MP_FUNC, "using parent interpreter in non-threaded mode");
-
- /* since we are not running in threaded mode PERL_SET_CONTEXT
- * is not necessary */
- /* PERL_SET_CONTEXT(scfg->mip->parent->perl); */
- /* let the perl interpreter point back to its interp */
- MP_THX_INTERP_SET(scfg->mip->parent->perl, scfg->mip->parent);
-
- return scfg->mip->parent;
- }
else {
request_rec *r;
apr_pool_userdata_get((void **)&r, "MODPERL_R", p);
- ap_assert(r);
+ MP_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);
+ MP_dSCFG((r ? s=r->server : s ? s : NULL));
MP_dDCFG;
modperl_config_con_t *ccfg;
const char *desc = NULL;
@@ -450,7 +439,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;
@@ -505,7 +497,7 @@ modperl_interp_t *modperl_interp_select(
}
}
- ap_assert(p);
+ MP_ASSERT(p);
#ifdef MP_TRACE
apr_pool_cleanup_register(p, (void *)interp,
Modified:
perl/modperl/branches/httpd24threading/src/modules/perl/modperl_module.c
URL:
http://svn.apache.org/viewvc/perl/modperl/branches/httpd24threading/src/modules/perl/modperl_module.c?rev=1537772&r1=1537771&r2=1537772&view=diff
==============================================================================
--- perl/modperl/branches/httpd24threading/src/modules/perl/modperl_module.c
(original)
+++ perl/modperl/branches/httpd24threading/src/modules/perl/modperl_module.c
Fri Nov 1 00:03:16 2013
@@ -168,7 +168,7 @@ static void *modperl_module_config_merge
SV *mrg_obj = (SV *)NULL, *base_obj, *add_obj;
#ifdef USE_ITHREADS
modperl_interp_t *interp;
- MP_PERL_CONTEXT_DECLARE;
+ pTHX;
#endif
/* if the module is loaded in vhost, base==NULL */
@@ -184,7 +184,7 @@ static void *modperl_module_config_merge
#ifdef USE_ITHREADS
interp = modperl_interp_pool_select(p, s);
- MP_PERL_CONTEXT_STORE_OVERRIDE(interp->perl);
+ aTHX = interp->perl;
#endif
table = modperl_module_config_table_get(aTHX_ TRUE);
@@ -196,7 +196,6 @@ static void *modperl_module_config_merge
MP_TRACE_i(MP_FUNC, "unselecting: (0x%lx)->refcnt=%ld",
interp, interp->refcnt);
modperl_interp_unselect(interp);
- MP_PERL_CONTEXT_RESTORE;
#endif
return addv;
}
@@ -250,7 +249,6 @@ static void *modperl_module_config_merge
MP_TRACE_i(MP_FUNC, "unselecting: (0x%lx)->refcnt=%ld",
interp, interp->refcnt);
modperl_interp_unselect(interp);
- MP_PERL_CONTEXT_RESTORE;
#endif
return (void *)mrg;
Modified:
perl/modperl/branches/httpd24threading/src/modules/perl/modperl_svptr_table.c
URL:
http://svn.apache.org/viewvc/perl/modperl/branches/httpd24threading/src/modules/perl/modperl_svptr_table.c?rev=1537772&r1=1537771&r2=1537772&view=diff
==============================================================================
---
perl/modperl/branches/httpd24threading/src/modules/perl/modperl_svptr_table.c
(original)
+++
perl/modperl/branches/httpd24threading/src/modules/perl/modperl_svptr_table.c
Fri Nov 1 00:03:16 2013
@@ -184,7 +184,7 @@ modperl_svptr_table_fetch(pTHX_ PTR_TBL_
{
PTR_TBL_ENT_t *tblent;
UV hash = PTR2UV(sv);
- assert(tbl);
+ MP_ASSERT(tbl);
tblent = tbl->tbl_ary[hash & tbl->tbl_max];
for (; tblent; tblent = tblent->next) {
if (tblent->oldval == sv)
@@ -205,7 +205,7 @@ modperl_svptr_table_store(pTHX_ PTR_TBL_
UV hash = PTR2UV(oldv);
bool i = 1;
- assert(tbl);
+ MP_ASSERT(tbl);
otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
for (tblent = *otblent; tblent; i=0, tblent = tblent->next) {
if (tblent->oldval == oldv) {