--- /dev/null
+Index: RELEASE
+===================================================================
+--- RELEASE (.../tags/2_0_3) (revision 630610)
++++ RELEASE (.../trunk) (revision 630610)
+@@ -30,7 +30,7 @@
+ make sure you give the correct permissions to them.
+
+ 1. 'make dist' - to make sure nothing is missing from the manifest,
+- etc. Now test this generated package mod_perl-2.0.3.tar.gz (not
++ etc. Now test this generated package mod_perl-2.0.4.tar.gz (not
+ the current build) with as many
+ configurations as possible on as many platforms as possible,
+ unpacking the package each time afresh.
+@@ -55,7 +55,7 @@
+ to the modperl/dev list (may be longer to give most people a chance
+ to catch up). no need to tag this package
+
+- Subject: [RELEASE CANDIDATE]: mod_perl-2.0.3 RC\d+
++ Subject: [RELEASE CANDIDATE]: mod_perl-2.0.4 RC\d+
+
+ 2a. if problems are detected during stage 2, repeat stages 1 and 2.
+
+@@ -82,8 +82,8 @@
+
+ f. Update the svn:externals in the new tag
+ (you can't propedit remotely yet in svn)
+- svn co https://svn.apache.org/repos/asf/perl/tags/2_0_3
+- svn propedit svn:xternals 2_0_3
++ svn co https://svn.apache.org/repos/asf/perl/modperl/tags/2_0_3
++ svn propedit svn:externals 2_0_3
+ Update the Apache-Test line to the tag you previously created.
+ Update the docs line to the current tag.
+ svn ci
+@@ -93,29 +93,29 @@
+
+ h. test the final package again at least once
+
+-4. Release the package and update links (e.g. mod_perl-2.0.3.tar.gz)
++4. Release the package and update links (e.g. mod_perl-2.0.4.tar.gz)
+
+ a. upload to www.apache.org:/www/perl.apache.org/dist/
+
+- % scp mod_perl-2.0.3.tar.gz perl.apache.org:/www/perl.apache.org/dist/
++ % scp mod_perl-2.0.4.tar.gz perl.apache.org:/www/perl.apache.org/dist/
+
+ b. ssh to perl.apache.org, unpack the package, update symlinks to the
+ tar ball and unpacked distro:
+
+ % ssh perl.apache.org
+ % cd /www/perl.apache.org/dist/
+- % ln -sf mod_perl-2.0.3.tar.gz mod_perl-2.0-current.tar.gz
+- % tar -xzvf mod_perl-2.0.3.tar.gz
++ % ln -sf mod_perl-2.0.4.tar.gz mod_perl-2.0-current.tar.gz
++ % tar -xzvf mod_perl-2.0.4.tar.gz
+ % rm /www/perl.apache.org/dist/mod_perl-2.0-current
+- % ln -sf mod_perl-2.0.3 mod_perl-2.0-current
++ % ln -sf mod_perl-2.0.4 mod_perl-2.0-current
+
+ c. archive older releases (keep current + one prior release)
+
+- % mv /www/perl.apache.org/dist/mod_perl-2.0.0.tar.gz \
++ % mv /www/perl.apache.org/dist/mod_perl-2.0.2.tar.gz \
+ /www/perl.apache.org/dist/old
+- % mv /www/perl.apache.org/dist/mod_perl-2.0.0.tar.gz.asc \
++ % mv /www/perl.apache.org/dist/mod_perl-2.0.2.tar.gz.asc \
+ /www/perl.apache.org/dist/old
+- % rm -rf /www/perl.apache.org/dist/mod_perl-2.0.0
++ % rm -rf /www/perl.apache.org/dist/mod_perl-2.0.2
+
+ d. update the version and release date
+ modperl-docs/src/download/index_top.html and commit. It'll be
+@@ -138,27 +138,27 @@
+
+ a. sign your local copy of the tarball:
+
+- % gpg --detach-sign --armor mod_perl-2.0.3.tar.gz
++ % gpg --detach-sign --armor mod_perl-2.0.4.tar.gz
+
+- % pgps -b --armor mod_perl-2.0.3.tar.gz
++ % pgps -b --armor mod_perl-2.0.4.tar.gz
+
+ b. upload the generated sig file to www.apache.org:
+
+- % scp mod_perl-2.0.3.tar.gz.asc perl.apache.org:/www/perl.apache.org/dist/
++ % scp mod_perl-2.0.4.tar.gz.asc perl.apache.org:/www/perl.apache.org/dist/
+ % ssh www.apache.org
+ % cd /www/perl.apache.org/dist/
+- % chmod 0664 mod_perl-2.0.3.tar.gz.asc
+- % ln -sf mod_perl-2.0.3.tar.gz.asc mod_perl-2.0-current.tar.gz.asc
++ % chmod 0664 mod_perl-2.0.4.tar.gz.asc
++ % ln -sf mod_perl-2.0.4.tar.gz.asc mod_perl-2.0-current.tar.gz.asc
+
+ c. ask one of the other developers to double check the signature file
+ and tarball: download both files and verify the signature:
+
+- http://perl.apache.org/dist/mod_perl-2.0.3.tar.gz.asc
+- http://perl.apache.org/dist/mod_perl-2.0.3.tar.gz
++ http://perl.apache.org/dist/mod_perl-2.0.4.tar.gz.asc
++ http://perl.apache.org/dist/mod_perl-2.0.4.tar.gz
+
+- % gpg --verify mod_perl-2.0.3.tar.gz.asc
++ % gpg --verify mod_perl-2.0.4.tar.gz.asc
+
+- % pgpv mod_perl-2.0.3.tar.gz.asc
++ % pgpv mod_perl-2.0.4.tar.gz.asc
+
+ d. make sure that the files you just created are group rw so
+ all the dist admins can make changes:
+@@ -172,10 +172,10 @@
+ a. unpack the package, update symlinks to the tarball and unpacked distro:
+
+ % cd /www/www.apache.org/dist/perl/
+- % cp /www/perl.apache.org/dist/mod_perl-2.0.3.tar.gz* .
+- % tar -xzvf mod_perl-2.0.3.tar.gz
+- % mv mod_perl-2.0.0.tar.gz* /www/archive.apache.org/dist/perl/
+- % rm -rf mod_perl-2.0.0
++ % cp /www/perl.apache.org/dist/mod_perl-2.0.4.tar.gz* .
++ % tar -xzvf mod_perl-2.0.4.tar.gz
++ % mv mod_perl-2.0.2.tar.gz* /www/archive.apache.org/dist/perl/
++ % rm -rf mod_perl-2.0.2
+
+ b. make sure that the files you just created are group rw so
+
+@@ -188,11 +188,11 @@
+
+ a. post ... to the modperl, announce lists
+ Note, to post to announce@, you must be sending from an apache.org address.
+- Subject: [ANNOUNCE] mod_perl 2.0.3
++ Subject: [ANNOUNCE] mod_perl 2.0.4
+ include
+ - link at perl.apache.org:
+- http://apache.org/dist/perl/mod_perl-2.0.3.tar.gz
+- http://apache.org/dist/perl/mod_perl-2.0.3.tar.gz.asc (pgp sig)
++ http://apache.org/dist/perl/mod_perl-2.0.4.tar.gz
++ http://apache.org/dist/perl/mod_perl-2.0.4.tar.gz.asc (pgp sig)
+ - MD5 sig (as it comes from CPAN upload announce).
+ - the latest Changes
+
+@@ -203,7 +203,7 @@
+ b. edit ./Changes:
+ - start a new item with incremented version + '-dev'
+
+- =item 2.0.3-dev
++ =item 2.0.5-dev
+
+ c. add a release entry in STATUS
+
+@@ -214,7 +214,7 @@
+
+ e. commit the changed files
+
+- % svn ci -m "start 2.0.3-dev cycle" Changes lib/mod_perl2.pm \
++ % svn ci -m "start 2.0.4-dev cycle" Changes lib/mod_perl2.pm \
+ STATUS RELEASE
+
+ 10. Old Versions
+Index: STATUS
+===================================================================
+--- STATUS (.../tags/2_0_3) (revision 630610)
++++ STATUS (.../trunk) (revision 630610)
+@@ -3,6 +3,7 @@
+
+ Release:
+ --------
++ 2.000.03 : Released Nov 29, 2006
+ 2.000.02 : Released Oct 20, 2005
+ 2.000.01 : Released Jun 17, 2005
+ 2.000.00 : Released May 20, 2005
+Index: src/modules/perl/modperl_handler.c
+===================================================================
+--- src/modules/perl/modperl_handler.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_handler.c (.../trunk) (revision 630610)
+@@ -18,7 +18,7 @@
+
+ modperl_handler_t *modperl_handler_new(apr_pool_t *p, const char *name)
+ {
+- modperl_handler_t *handler =
++ modperl_handler_t *handler =
+ (modperl_handler_t *)apr_pcalloc(p, sizeof(*handler));
+
+ switch (*name) {
+@@ -38,7 +38,7 @@
+
+ handler->cv = NULL;
+ handler->name = name;
+- MP_TRACE_h(MP_FUNC, "[%s] new handler %s\n",
++ MP_TRACE_h(MP_FUNC, "[%s] new handler %s",
+ modperl_pid_tid(p), handler->name);
+
+ return handler;
+@@ -72,7 +72,7 @@
+ * when perl_clone is called, each clone will clone that CV value, but
+ * we will still be able to find it, since we stored it in the
+ * hash. so we retrieve the CV value, whatever it is and we run it.
+- *
++ *
+ * that explanation can be written and run in perl:
+ *
+ * use threads;
+@@ -97,7 +97,7 @@
+ {
+ /* re-use modperl_mgv_t entry which is otherwise is not used
+ * by anon handlers */
+- modperl_mgv_t *anon =
++ modperl_mgv_t *anon =
+ (modperl_mgv_t *)apr_pcalloc(p, sizeof(*anon));
+
+ anon->name = apr_psprintf(p, "anon%d", modperl_global_anon_cnt_next());
+@@ -157,7 +157,7 @@
+ static
+ modperl_handler_t *modperl_handler_new_anon(pTHX_ apr_pool_t *p, CV *cv)
+ {
+- modperl_handler_t *handler =
++ modperl_handler_t *handler =
+ (modperl_handler_t *)apr_pcalloc(p, sizeof(*handler));
+ MpHandlerPARSED_On(handler);
+ MpHandlerANON_On(handler);
+@@ -174,7 +174,7 @@
+ handler->cv = cv;
+ handler->name = NULL;
+
+- MP_TRACE_h(MP_FUNC, "[%s] new cached cv anon handler\n",
++ MP_TRACE_h(MP_FUNC, "[%s] new cached cv anon handler",
+ modperl_pid_tid(p));
+ #endif
+
+@@ -244,7 +244,7 @@
+ modperl_handler_t *modperl_handler_dup(apr_pool_t *p,
+ modperl_handler_t *h)
+ {
+- MP_TRACE_h(MP_FUNC, "dup handler %s\n", modperl_handler_name(h));
++ MP_TRACE_h(MP_FUNC, "dup handler %s", modperl_handler_name(h));
+ return modperl_handler_new(p, h->name);
+ }
+
+@@ -279,12 +279,12 @@
+ for (i=0; i<base_a->nelts; i++) {
+ for (j=0; j<add_a->nelts; j++) {
+ if (modperl_handler_equal(base_h[i], add_h[j])) {
+- MP_TRACE_d(MP_FUNC, "both base and new config contain %s\n",
++ MP_TRACE_d(MP_FUNC, "both base and new config contain %s",
+ add_h[j]->name);
+ }
+ else {
+ modperl_handler_array_push(mrg_a, add_h[j]);
+- MP_TRACE_d(MP_FUNC, "base does not contain %s\n",
++ MP_TRACE_d(MP_FUNC, "base does not contain %s",
+ add_h[j]->name);
+ }
+ }
+@@ -363,7 +363,7 @@
+ * $r->push/set at request time will create entries in r->request_config
+ * push will first merge with configured handlers, unless an entry
+ * in r->request_config already exists. in this case, push or set has
+- * already been called for the given handler,
++ * already been called for the given handler,
+ * r->request_config entries then override those in r->per_dir_config
+ */
+
+@@ -427,15 +427,17 @@
+ /* just a lookup */
+ break;
+ case MP_HANDLER_ACTION_PUSH:
+- if (ravp && !*ravp) {
+- if (*avp) {
+- /* merge with existing configured handlers */
+- *ravp = apr_array_copy(p, *avp);
++ if (ravp) {
++ if (!*ravp) {
++ if (*avp) {
++ /* merge with existing configured handlers */
++ *ravp = apr_array_copy(p, *avp);
++ }
++ else {
++ /* no request handlers have been previously pushed or set */
++ *ravp = modperl_handler_array_new(p);
++ }
+ }
+- else {
+- /* no request handlers have been previously pushed or set */
+- *ravp = modperl_handler_array_new(p);
+- }
+ }
+ else if (!*avp) {
+ /* directly modify the configuration at startup time */
+@@ -514,6 +516,7 @@
+ }
+ name = apr_pstrcat(p, HvNAME(GvSTASH(gv)), "::", GvNAME(gv), NULL);
+ return modperl_handler_new(p, apr_pstrdup(p, name));
++ default:
+ break;
+ };
+
+@@ -530,7 +533,7 @@
+ return TRUE;
+ }
+
+- MP_TRACE_h(MP_FUNC, "unable to push_handler 0x%lx\n",
++ MP_TRACE_h(MP_FUNC, "unable to push_handler 0x%lx",
+ (unsigned long)sv);
+
+ return FALSE;
+@@ -569,7 +572,7 @@
+ }
+
+ if (!modperl_mgv_resolve(aTHX_ handler, p, handler->name, TRUE)) {
+- MP_TRACE_h(MP_FUNC, "failed to resolve handler %s\n",
++ MP_TRACE_h(MP_FUNC, "failed to resolve handler %s",
+ handler->name);
+ }
+
+Index: src/modules/perl/modperl_common_types.h
+===================================================================
+--- src/modules/perl/modperl_common_types.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_common_types.h (.../trunk) (revision 630610)
+@@ -26,4 +26,3 @@
+ } modperl_uri_t;
+
+ #endif /* MODPERL_COMMON_TYPES_H */
+-
+Index: src/modules/perl/modperl_handler.h
+===================================================================
+--- src/modules/perl/modperl_handler.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_handler.h (.../trunk) (revision 630610)
+@@ -27,7 +27,7 @@
+ MP_INLINE modperl_mgv_t *modperl_handler_anon_next(pTHX_ apr_pool_t *p);
+ MP_INLINE void modperl_handler_anon_add(pTHX_ modperl_mgv_t *anon, CV *cv);
+ MP_INLINE CV *modperl_handler_anon_get(pTHX_ modperl_mgv_t *anon);
+-
++
+ #define modperl_handler_array_new(p) \
+ apr_array_make(p, 1, sizeof(modperl_handler_t *))
+
+@@ -45,7 +45,7 @@
+ modperl_handler_t *modperl_handler_new_from_sv(pTHX_ apr_pool_t *p, SV *sv);
+
+ MP_INLINE const char *modperl_handler_name(modperl_handler_t *handler);
+-
++
+ int modperl_handler_resolve(pTHX_ modperl_handler_t **handp,
+ apr_pool_t *p, server_rec *s);
+
+@@ -66,7 +66,7 @@
+ modperl_handler_action_e action,
+ const char **desc);
+
+-MpAV **modperl_handler_get_handlers(request_rec *r, conn_rec *c,server_rec *s,
++MpAV **modperl_handler_get_handlers(request_rec *r, conn_rec *c,server_rec *s,
+ apr_pool_t *p, const char *name,
+ modperl_handler_action_e action);
+
+Index: src/modules/perl/modperl_apache_compat.c
+===================================================================
+--- src/modules/perl/modperl_apache_compat.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_apache_compat.c (.../trunk) (revision 630610)
+@@ -27,3 +27,45 @@
+ * and don't forget to insert comments explaining exactly
+ * which httpd release allows us to remove the compat code
+ */
++
++/* pre-APACHE_2.2.4 */
++#if ! AP_MODULE_MAGIC_AT_LEAST(20051115,4)
++
++#define modperl_warn_fallback_http_function(ver, fallback) \
++ { \
++ dTHX; \
++ Perl_warn(aTHX_ "%s() not available until httpd/%s " \
++ "falling back to %s()", \
++ __func__, ver, fallback); \
++ }
++
++/* added in APACHE_2.2.4 */
++AP_DECLARE(const char *) ap_get_server_description(void) {
++ modperl_warn_fallback_http_function("2.2.4", "ap_get_server_version");
++ return ap_get_server_version();
++}
++
++AP_DECLARE(const char *) ap_get_server_banner(void) {
++ modperl_warn_fallback_http_function("2.2.4", "ap_get_server_version");
++ return ap_get_server_version();
++}
++
++#endif /* pre-APACHE_2.2.4 */
++
++/* since-APACHE-2.3.0 */
++#if AP_MODULE_MAGIC_AT_LEAST(20060905,0)
++#define modperl_warn_deprecated_http_function(ver, fallback) \
++ { \
++ dTHX; \
++ Perl_warn(aTHX_ "%s() is deprecated since httpd/%s " \
++ "try using %s() instead", \
++ __func__, ver, fallback); \
++ }
++
++AP_DECLARE(const char *) ap_get_server_version(void) {
++ modperl_warn_deprecated_http_function("2.3.0",
++ "ap_get_server_(description|banner)");
++ return ap_get_server_banner();
++}
++
++#endif /* since-APACHE-2.3.0 */
+Index: src/modules/perl/modperl_module.c
+===================================================================
+--- src/modules/perl/modperl_module.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_module.c (.../trunk) (revision 630610)
+@@ -120,7 +120,7 @@
+
+ modperl_svptr_table_delete(aTHX_ cleanup->table, cleanup->ptr);
+
+- MP_TRACE_c(MP_FUNC, "deleting ptr 0x%lx from table 0x%lx\n",
++ MP_TRACE_c(MP_FUNC, "deleting ptr 0x%lx from table 0x%lx",
+ (unsigned long)cleanup->ptr,
+ (unsigned long)cleanup->table);
+
+@@ -211,7 +211,7 @@
+ int count;
+ dSP;
+
+- MP_TRACE_c(MP_FUNC, "calling %s->%s\n",
++ MP_TRACE_c(MP_FUNC, "calling %s->%s",
+ SvCLASS(base_obj), modperl_mgv_last_name(method));
+
+ ENTER;SAVETMPS;
+@@ -250,7 +250,7 @@
+ modperl_interp_unselect(interp); */
+ MP_PERL_CONTEXT_RESTORE;
+ #endif
+-
++
+ return (void *)mrg;
+ }
+
+@@ -296,7 +296,7 @@
+ return NULL;
+ }
+
+- MP_TRACE_c(MP_FUNC, "%s cfg=0x%lx for %s.%s\n",
++ MP_TRACE_c(MP_FUNC, "%s cfg=0x%lx for %s.%s",
+ method, (unsigned long)cfg,
+ mname, parms->cmd->name);
+
+@@ -420,7 +420,7 @@
+ }
+
+ if (obj) {
+- MP_TRACE_c(MP_FUNC, "found per-dir obj=0x%lx for %s.%s\n",
++ MP_TRACE_c(MP_FUNC, "found per-dir obj=0x%lx for %s.%s",
+ (unsigned long)obj,
+ info->modp->name, cmd->name);
+ }
+@@ -440,7 +440,7 @@
+ }
+
+ if (srv_obj) {
+- MP_TRACE_c(MP_FUNC, "found per-srv obj=0x%lx for %s.%s\n",
++ MP_TRACE_c(MP_FUNC, "found per-srv obj=0x%lx for %s.%s",
+ (unsigned long)srv_obj,
+ info->modp->name, cmd->name);
+ }
+@@ -647,7 +647,7 @@
+ #ifdef USE_ITHREADS
+ MP_dSCFG(s);
+ dTHXa(scfg->mip->parent->perl);
+-#endif
++#endif
+ module_cmds = (AV*)SvRV(mod_cmds);
+
+ fill = AvFILL(module_cmds);
+@@ -772,7 +772,7 @@
+ HV *stash = gv_stashpv(modp->name, FALSE);
+ GV *gv = gv_fetchmethod_autoload(stash, method, FALSE);
+
+- MP_TRACE_c(MP_FUNC, "looking for method %s in package `%s'...%sfound\n",
++ MP_TRACE_c(MP_FUNC, "looking for method %s in package `%s'...%sfound",
+ method, modp->name,
+ MP_isGV(gv) ? "" : "not ");
+
+@@ -809,7 +809,7 @@
+ /* use this slot for our context */
+ modp->dynamic_load_handle = minfo;
+
+- /*
++ /*
+ * XXX: we should lookup here if the Perl methods exist,
+ * and set these pointers only if they do.
+ */
+@@ -854,7 +854,7 @@
+ apr_hash_set(scfg->modules, apr_pstrdup(p, name), APR_HASH_KEY_STRING, modp);
+
+ #ifdef USE_ITHREADS
+- /*
++ /*
+ * if the Perl module is loaded in the base server and a vhost
+ * has configuration directives from that module, but no mod_perl.c
+ * directives, scfg == NULL when modperl_module_cmd_take123 is run.
+@@ -870,7 +870,7 @@
+ return NULL;
+ }
+
+-SV *modperl_module_config_get_obj(pTHX_ SV *pmodule, server_rec *s,
++SV *modperl_module_config_get_obj(pTHX_ SV *pmodule, server_rec *s,
+ ap_conf_vector_t *v)
+ {
+ MP_dSCFG(s);
+Index: src/modules/perl/modperl_filter.c
+===================================================================
+--- src/modules/perl/modperl_filter.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_filter.c (.../trunk) (revision 630610)
+@@ -85,7 +85,7 @@
+ {
+ const char *name = f->frec->name;
+
+- /* frec->name is always lowercased */
++ /* frec->name is always lowercased */
+ if (!strcasecmp(name, MP_FILTER_CONNECTION_INPUT_NAME) ||
+ !strcasecmp(name, MP_FILTER_CONNECTION_OUTPUT_NAME) ||
+ !strcasecmp(name, MP_FILTER_REQUEST_INPUT_NAME) ||
+@@ -105,7 +105,7 @@
+ APR_BRIGADE_INSERT_TAIL(filter->bb_out, b);
+ ((modperl_filter_ctx_t *)filter->f->ctx)->sent_eos = 1;
+ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
+- "write out: EOS bucket\n", MP_FILTER_NAME(filter->f));
++ "write out: EOS bucket", MP_FILTER_NAME(filter->f));
+ return APR_SUCCESS;
+ }
+
+@@ -115,7 +115,7 @@
+ apr_bucket *b = apr_bucket_flush_create(ba);
+ APR_BRIGADE_INSERT_TAIL(filter->bb_out, b);
+ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
+- "write out: FLUSH bucket\n", MP_FILTER_NAME(filter->f));
++ "write out: FLUSH bucket", MP_FILTER_NAME(filter->f));
+ return APR_SUCCESS;
+ }
+
+@@ -128,7 +128,7 @@
+ APR_BRIGADE_INSERT_TAIL(bb, b);
+ ((modperl_filter_ctx_t *)f->ctx)->sent_eos = 1;
+ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
+- "write out: EOS bucket in separate bb\n", MP_FILTER_NAME(f));
++ "write out: EOS bucket in separate bb", MP_FILTER_NAME(f));
+ return ap_pass_brigade(f->next, bb);
+ }
+
+@@ -140,7 +140,7 @@
+ apr_bucket *b = apr_bucket_flush_create(ba);
+ APR_BRIGADE_INSERT_TAIL(bb, b);
+ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
+- "write out: FLUSH bucket in separate bb\n", MP_FILTER_NAME(f));
++ "write out: FLUSH bucket in separate bb", MP_FILTER_NAME(f));
+ return ap_pass_brigade(f, bb);
+ }
+
+@@ -165,7 +165,7 @@
+ const char *body;
+ int status;
+
+- MP_TRACE_f(MP_FUNC, "\n\n\tparsing headers: %db [%s]\n", len,
++ MP_TRACE_f(MP_FUNC, "parsing headers: %db [%s]", len,
+ MP_TRACE_STR_TRUNC(wb->pool, buf, len));
+
+ status = modperl_cgi_header_parse(r, (char *)buf, &len, &body);
+@@ -209,9 +209,9 @@
+ APR_BRIGADE_INSERT_TAIL(bb, bucket);
+ }
+
+- MP_TRACE_f(MP_FUNC, "\n\n\twrite out: %db [%s]\n"
+- "\t\tfrom %s\n\t\tto %s filter handler\n",
+- len,
++ MP_TRACE_f(MP_FUNC, "\n\n\twrite out: %db [%s]"
++ "\t\tfrom %s\n\t\tto %s filter handler",
++ len,
+ MP_TRACE_STR_TRUNC(wb->pool, buf, len),
+ ((wb->r && wb->filters == &wb->r->output_filters)
+ ? "response handler" : "current filter handler"),
+@@ -343,7 +343,7 @@
+
+ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
+ "new: %s %s filter (modperl_filter_t *0x%lx), "
+- "f (ap_filter_t *0x%lx)\n",
++ "f (ap_filter_t *0x%lx)",
+ MP_FILTER_NAME(f),
+ MP_FILTER_TYPE(filter),
+ MP_FILTER_MODE(filter),
+@@ -404,7 +404,7 @@
+ FREETMPS;LEAVE;
+
+ if (init_handler) {
+- MP_TRACE_h(MP_FUNC, "found init handler %s\n",
++ MP_TRACE_h(MP_FUNC, "found init handler %s",
+ modperl_handler_name(init_handler));
+
+ if (!init_handler->attrs & MP_FILTER_INIT_HANDLER) {
+@@ -427,7 +427,7 @@
+
+ static int modperl_run_filter_init(ap_filter_t *f,
+ modperl_filter_mode_e mode,
+- modperl_handler_t *handler)
++ modperl_handler_t *handler)
+ {
+ AV *args = Nullav;
+ int status;
+@@ -438,9 +438,9 @@
+ apr_pool_t *p = r ? r->pool : c->pool;
+ modperl_filter_t *filter = modperl_filter_new(f, NULL, mode, 0, 0, 0);
+
+- MP_dINTERP_SELECT(r, c, s);
++ MP_dINTERP_SELECT(r, c, s);
+
+- MP_TRACE_h(MP_FUNC, "running filter init handler %s\n",
++ MP_TRACE_h(MP_FUNC, "running filter init handler %s",
+ modperl_handler_name(handler));
+
+ modperl_handler_make_args(aTHX_ &args,
+@@ -465,9 +465,9 @@
+ MP_INTERP_PUTBACK(interp);
+
+ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
+- "return: %d\n", modperl_handler_name(handler), status);
++ "return: %d", modperl_handler_name(handler), status);
+
+- return status;
++ return status;
+ }
+
+
+@@ -572,7 +572,7 @@
+ MP_INTERP_PUTBACK(interp);
+
+ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
+- "return: %d\n", modperl_handler_name(handler), status);
++ "return: %d", modperl_handler_name(handler), status);
+
+ return status;
+ }
+@@ -601,7 +601,7 @@
+ {
+ if (!filter->bb_in || MP_FILTER_EMPTY(filter)) {
+ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
+- "read in: bucket brigade is empty\n",
++ "read in: bucket brigade is empty",
+ MP_FILTER_NAME(filter->f));
+ return 0;
+ }
+@@ -623,7 +623,7 @@
+
+ if (MP_FILTER_IS_EOS(filter)) {
+ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
+- "read in: EOS bucket\n",
++ "read in: EOS bucket",
+ MP_FILTER_NAME(filter->f));
+
+ filter->seen_eos = 1;
+@@ -634,7 +634,7 @@
+ }
+ else if (MP_FILTER_IS_FLUSH(filter)) {
+ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
+- "read in: FLUSH bucket\n",
++ "read in: FLUSH bucket",
+ MP_FILTER_NAME(filter->f));
+ filter->flush = 1;
+ return 0;
+@@ -669,7 +669,7 @@
+ /* modperl_brigade_dump(filter->bb_in, NULL); */
+
+ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
+- "wanted: %db\n",
++ "wanted: %db",
+ MP_FILTER_NAME(filter->f),
+ wanted);
+
+@@ -677,7 +677,7 @@
+ if (filter->remaining >= wanted) {
+ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
+ "eating and returning %d [%s]\n\tof "
+- "remaining %db\n",
++ "remaining %db",
+ MP_FILTER_NAME(filter->f),
+ wanted,
+ MP_TRACE_STR_TRUNC(filter->pool, filter->leftover, wanted),
+@@ -689,7 +689,7 @@
+ }
+ else {
+ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
+- "eating remaining %db\n",
++ "eating remaining %db",
+ MP_FILTER_NAME(filter->f),
+ filter->remaining);
+ sv_catpvn(buffer, filter->leftover, filter->remaining);
+@@ -714,7 +714,7 @@
+ if (filter->rc == APR_SUCCESS) {
+ MP_TRACE_f(MP_FUNC,
+ MP_FILTER_NAME_FORMAT
+- "read in: %s bucket with %db (0x%lx)\n",
++ "read in: %s bucket with %db (0x%lx)",
+ MP_FILTER_NAME(filter->f),
+ filter->bucket->type->name,
+ buf_len,
+@@ -743,7 +743,7 @@
+
+ MP_TRACE_f(MP_FUNC,
+ MP_FILTER_NAME_FORMAT
+- "return: %db from %d bucket%s [%s]\n\t(%db leftover)\n",
++ "return: %db from %d bucket%s [%s]\n\t(%db leftover)",
+ MP_FILTER_NAME(filter->f),
+ len, num_buckets, ((num_buckets == 1) ? "" : "s"),
+ MP_TRACE_STR_TRUNC(filter->pool, SvPVX(buffer), len),
+@@ -764,7 +764,7 @@
+ filter->bb_in = apr_brigade_create(filter->pool,
+ filter->f->c->bucket_alloc);
+ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
+- "retrieving bb: 0x%lx\n",
++ "retrieving bb: 0x%lx",
+ MP_FILTER_NAME(filter->f),
+ (unsigned long)(filter->bb_in));
+ MP_RUN_CROAK(ap_get_brigade(filter->f->next, filter->bb_in,
+@@ -870,7 +870,7 @@
+ char *copy = apr_pmemdup(filter->pool, buf, *len);
+ apr_bucket *bucket = apr_bucket_transient_create(copy, *len, ba);
+ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
+- "write out: %db [%s]:\n",
++ "write out: %db [%s]:",
+ MP_FILTER_NAME(filter->f), *len,
+ MP_TRACE_STR_TRUNC(filter->pool, copy, *len));
+ APR_BRIGADE_INSERT_TAIL(filter->bb_out, bucket);
+@@ -898,7 +898,7 @@
+ MP_TRACE_f(MP_FUNC,
+ MP_FILTER_NAME_FORMAT
+ "write_out: EOS was already sent, "
+- "passing through the brigade\n",
++ "passing through the brigade",
+ MP_FILTER_NAME(f));
+ return ap_pass_brigade(f->next, bb);
+ }
+@@ -932,7 +932,7 @@
+ MP_TRACE_f(MP_FUNC,
+ MP_FILTER_NAME_FORMAT
+ "write out: EOS was already sent, "
+- "passing through the brigade\n",
++ "passing through the brigade",
+ MP_FILTER_NAME(f));
+ return ap_get_brigade(f->next, bb, input_mode, block, readbytes);
+ }
+@@ -998,7 +998,7 @@
+ addfunc(handlers[i]->name, NULL, NULL, c);
+ MP_TRACE_f(MP_FUNC,
+ "a non-mod_perl %s handler %s configured "
+- "(connection)\n", type, handlers[i]->name);
++ "(connection)", type, handlers[i]->name);
+ continue;
+ }
+
+@@ -1006,7 +1006,7 @@
+ * configured outside the resource container */
+ if (!(handlers[i]->attrs & MP_FILTER_CONNECTION_HANDLER)) {
+ MP_TRACE_f(MP_FUNC,
+- "%s is not a FilterConnection handler, skipping\n",
++ "%s is not a FilterConnection handler, skipping",
+ handlers[i]->name);
+ continue;
+ }
+@@ -1033,14 +1033,14 @@
+ }
+ }
+
+- MP_TRACE_h(MP_FUNC, "%s handler %s configured (connection)\n",
++ MP_TRACE_h(MP_FUNC, "%s handler %s configured (connection)",
+ type, handlers[i]->name);
+ }
+
+ return OK;
+ }
+
+- MP_TRACE_h(MP_FUNC, "no %s handlers configured (connection)\n", type);
++ MP_TRACE_h(MP_FUNC, "no %s handlers configured (connection)", type);
+
+ return DECLINED;
+ }
+@@ -1068,7 +1068,7 @@
+ if ((handlers[i]->attrs & MP_FILTER_HTTPD_HANDLER)) {
+ addfunc(handlers[i]->name, NULL, r, r->connection);
+ MP_TRACE_f(MP_FUNC,
+- "a non-mod_perl %s handler %s configured (%s)\n",
++ "a non-mod_perl %s handler %s configured (%s)",
+ type, handlers[i]->name, r->uri);
+ continue;
+ }
+@@ -1079,7 +1079,7 @@
+ */
+ if ((handlers[i]->attrs & MP_FILTER_CONNECTION_HANDLER)) {
+ MP_TRACE_f(MP_FUNC,
+- "%s is not a FilterRequest handler, skipping\n",
++ "%s is not a FilterRequest handler, skipping",
+ handlers[i]->name);
+ continue;
+ }
+@@ -1096,7 +1096,7 @@
+ /* XXX: I think this won't work as f->frec->name gets
+ * lowercased when added to the chain */
+ if (*fname == 'M' && strEQ(fname, name)) {
+- modperl_handler_t *ctx_handler =
++ modperl_handler_t *ctx_handler =
+ ((modperl_filter_ctx_t *)f->ctx)->handler;
+
+ if (modperl_handler_equal(ctx_handler, handlers[i])) {
+@@ -1114,7 +1114,7 @@
+
+ if (registered) {
+ MP_TRACE_f(MP_FUNC,
+- "%s %s already registered\n",
++ "%s %s already registered",
+ handlers[i]->name, type);
+ continue;
+ }
+@@ -1141,14 +1141,14 @@
+ }
+ }
+
+- MP_TRACE_h(MP_FUNC, "%s handler %s configured (%s)\n",
++ MP_TRACE_h(MP_FUNC, "%s handler %s configured (%s)",
+ type, handlers[i]->name, r->uri);
+ }
+
+ return OK;
+ }
+
+- MP_TRACE_h(MP_FUNC, "no %s handlers configured (%s)\n",
++ MP_TRACE_h(MP_FUNC, "no %s handlers configured (%s)",
+ type, r->uri);
+
+ return DECLINED;
+@@ -1215,7 +1215,7 @@
+ modperl_filter_f_cleanup,
+ apr_pool_cleanup_null);
+
+- /* has to resolve early so we can check for init functions */
++ /* has to resolve early so we can check for init functions */
+ if (!modperl_mgv_resolve(aTHX_ handler, pool, handler->name, TRUE)) {
+ Perl_croak(aTHX_ "unable to resolve handler %s\n",
+ modperl_handler_name(handler));
+@@ -1255,7 +1255,7 @@
+ }
+ }
+
+- MP_TRACE_h(MP_FUNC, "%s handler %s configured (connection)\n",
++ MP_TRACE_h(MP_FUNC, "%s handler %s configured (connection)",
+ type, name);
+
+ return;
+Index: src/modules/perl/modperl_common_util.c
+===================================================================
+--- src/modules/perl/modperl_common_util.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_common_util.c (.../trunk) (revision 630610)
+@@ -23,9 +23,8 @@
+
+ #include "modperl_common_util.h"
+
+-
+ /* Prefetch magic requires perl 5.8 */
+-#if ((PERL_REVISION == 5) && (PERL_VERSION >= 8))
++#if MP_PERL_VERSION_AT_LEAST(5, 8, 0)
+
+ /* A custom MGVTBL with mg_copy slot filled in allows us to FETCH a
+ * table entry immediately during iteration. For multivalued keys
+@@ -41,7 +40,7 @@
+ */
+
+ MP_INLINE static
+-int modperl_table_magic_copy(pTHX_ SV *sv, MAGIC *mg, SV *nsv,
++int modperl_table_magic_copy(pTHX_ SV *sv, MAGIC *mg, SV *nsv,
+ const char *name, int namelen)
+ {
+ /* prefetch the value whenever we're iterating over the keys */
+@@ -54,11 +53,11 @@
+ }
+
+
+-static const MGVTBL modperl_table_magic_prefetch = {0, 0, 0, 0, 0,
++static const MGVTBL modperl_table_magic_prefetch = {0, 0, 0, 0, 0,
+ modperl_table_magic_copy};
+ #endif /* End of prefetch magic */
+
+-MP_INLINE SV *modperl_hash_tie(pTHX_
++MP_INLINE SV *modperl_hash_tie(pTHX_
+ const char *classname,
+ SV *tsv, void *p)
+ {
+@@ -68,7 +67,7 @@
+ sv_setref_pv(rsv, classname, p);
+
+ /* Prefetch magic requires perl 5.8 */
+-#if ((PERL_REVISION == 5) && (PERL_VERSION >= 8))
++#if MP_PERL_VERSION_AT_LEAST(5, 8, 0)
+
+ sv_magicext(hv, NULL, PERL_MAGIC_ext, NULL, Nullch, -1);
+ SvMAGIC(hv)->mg_virtual = (MGVTBL *)&modperl_table_magic_prefetch;
+@@ -82,7 +81,7 @@
+ gv_stashpv(classname, TRUE)));
+ }
+
+-MP_INLINE SV *modperl_hash_tied_object_rv(pTHX_
++MP_INLINE SV *modperl_hash_tied_object_rv(pTHX_
+ const char *classname,
+ SV *tsv)
+ {
+@@ -116,7 +115,7 @@
+ return &PL_sv_undef;
+ }
+
+-MP_INLINE void *modperl_hash_tied_object(pTHX_
++MP_INLINE void *modperl_hash_tied_object(pTHX_
+ const char *classname,
+ SV *tsv)
+ {
+@@ -134,7 +133,7 @@
+ {
+ GV *gv = newGVgen(pack);
+ SV *rv = newRV((SV*)gv);
+- (void)hv_delete(gv_stashpv(pack, TRUE),
++ (void)hv_delete(gv_stashpv(pack, TRUE),
+ GvNAME(gv), GvNAMELEN(gv), G_DISCARD);
+ return rv;
+ }
+Index: src/modules/perl/modperl_pcw.c
+===================================================================
+--- src/modules/perl/modperl_pcw.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_pcw.c (.../trunk) (revision 630610)
+@@ -32,7 +32,7 @@
+ for (i = 0; i < sconf->sec_url->nelts; i++) {
+ core_dir_config *conf =
+ ap_get_module_config(urls[i], &core_module);
+- void *dir_cfg = ap_get_module_config(urls[i], modp);
++ void *dir_cfg = ap_get_module_config(urls[i], modp);
+
+ if (!dir_cb(pconf, s, dir_cfg, conf->d, data)) {
+ break;
+@@ -82,9 +82,9 @@
+ module *modp,
+ ap_pcw_dir_cb_t dir_cb, void *data)
+ {
+- core_dir_config *conf =
++ core_dir_config *conf =
+ ap_get_module_config(s->lookup_defaults, &core_module);
+- void *dir_cfg =
++ void *dir_cfg =
+ ap_get_module_config(s->lookup_defaults, modp);
+
+ dir_cb(pconf, s, dir_cfg, conf->d, data);
+@@ -108,7 +108,7 @@
+ ap_pcw_dir_cb_t dir_cb, ap_pcw_srv_cb_t srv_cb)
+ {
+ for (; s; s = s->next) {
+- core_dir_config *dconf =
++ core_dir_config *dconf =
+ ap_get_module_config(s->lookup_defaults,
+ &core_module);
+
+Index: src/modules/perl/modperl_apache_compat.h
+===================================================================
+--- src/modules/perl/modperl_apache_compat.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_apache_compat.h (.../trunk) (revision 630610)
+@@ -36,6 +36,23 @@
+ * which httpd release allows us to remove the compat code
+ */
+
++/* pre-APACHE_2.2.4 */
++#if ! AP_MODULE_MAGIC_AT_LEAST(20051115,4)
++
++/* added in APACHE_2.2.4 */
++AP_DECLARE(const char *) ap_get_server_description(void);
++AP_DECLARE(const char *) ap_get_server_banner(void);
++
++#endif /* pre-APACHE_2.2.4 */
++
++/* since-APACHE-2.3.0 */
++#if AP_MODULE_MAGIC_AT_LEAST(20060905,0)
++
++/* removed in APACHE-2.3.0 */
++AP_DECLARE(const char *) ap_get_server_version(void);
++
++#endif /* since-APACHE-2.3.0 */
++
+ /* ap_http_scheme is called ap_http_method in httpd 2.0 */
+ #ifndef ap_http_scheme
+ #define ap_http_scheme(r) ap_http_method(r)
+Index: src/modules/perl/modperl_module.h
+===================================================================
+--- src/modules/perl/modperl_module.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_module.h (.../trunk) (revision 630610)
+@@ -24,7 +24,7 @@
+ const char *modperl_module_add(apr_pool_t *p, server_rec *s,
+ const char *name, SV *mod_cmds);
+
+-SV *modperl_module_config_get_obj(pTHX_ SV *pmodule, server_rec *s,
++SV *modperl_module_config_get_obj(pTHX_ SV *pmodule, server_rec *s,
+ ap_conf_vector_t *v);
+
+ #endif /* MODPERL_MODULE_H */
+Index: src/modules/perl/modperl_filter.h
+===================================================================
+--- src/modules/perl/modperl_filter.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_filter.h (.../trunk) (revision 630610)
+@@ -25,9 +25,9 @@
+
+ #define MP_FILTER_CONNECTION_HANDLER 0x01
+ #define MP_FILTER_REQUEST_HANDLER 0x02
+-#define MP_FILTER_HAS_INIT_HANDLER 0x04
+-#define MP_FILTER_INIT_HANDLER 0x08
+-#define MP_FILTER_HTTPD_HANDLER 0x10
++#define MP_FILTER_HAS_INIT_HANDLER 0x04
++#define MP_FILTER_INIT_HANDLER 0x08
++#define MP_FILTER_HTTPD_HANDLER 0x10
+
+ typedef ap_filter_t * MP_FUNC_T(modperl_filter_add_t) (const char *, void *,
+ request_rec *,
+@@ -101,7 +101,7 @@
+ modperl_filter_t *filter,
+ SV *buffer,
+ apr_size_t wanted);
+-
++
+ MP_INLINE apr_status_t modperl_input_filter_write(pTHX_
+ modperl_filter_t *filter,
+ const char *buf,
+Index: src/modules/perl/modperl_common_util.h
+===================================================================
+--- src/modules/perl/modperl_common_util.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_common_util.h (.../trunk) (revision 630610)
+@@ -1,4 +1,3 @@
+-
+ /* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+@@ -78,13 +77,25 @@
+ #define MP_magical_tie(sv, mg_flags) \
+ SvFLAGS((SV*)sv) |= mg_flags
+
++/* some wrapper macros to detect perl versions
++ * and prevent code clutter */
++#define MP_PERL_VERSION_AT_LEAST(r, v, s) \
++ (PERL_REVISION == r && \
++ ((PERL_VERSION == v && PERL_SUBVERSION > s-1) || PERL_VERSION > v))
+
++#define MP_PERL_VERSION_AT_MOST(r, v, s) \
++ (PERL_REVISION == r && \
++ (PERL_VERSION < v || (PERL_VERSION == v && PERL_SUBVERSION < s+1)))
++
++#define MP_PERL_VERSION(r, v, s) \
++ (PERL_REVISION == r && PERL_VERSION == v && PERL_SUBVERSION == s)
++
+ /* tie %hash */
+ MP_INLINE SV *modperl_hash_tie(pTHX_ const char *classname,
+ SV *tsv, void *p);
+
+ /* tied %hash */
+-MP_INLINE SV *modperl_hash_tied_object_rv(pTHX_
++MP_INLINE SV *modperl_hash_tied_object_rv(pTHX_
+ const char *classname,
+ SV *tsv);
+ /* tied %hash */
+@@ -99,4 +110,3 @@
+ SV *modperl_perl_gensym(pTHX_ char *pack);
+
+ #endif /* MODPERL_COMMON_UTIL_H */
+-
+Index: src/modules/perl/modperl_options.c
+===================================================================
+--- src/modules/perl/modperl_options.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_options.c (.../trunk) (revision 630610)
+@@ -52,10 +52,10 @@
+
+ modperl_options_t *modperl_options_new(apr_pool_t *p, int type)
+ {
+- modperl_options_t *options =
++ modperl_options_t *options =
+ (modperl_options_t *)apr_pcalloc(p, sizeof(*options));
+
+- options->opts = options->unset =
++ options->opts = options->unset =
+ (type == MpSrvType ? MpSrv_f_UNSET : MpDir_f_UNSET);
+
+ return options;
+Index: src/modules/perl/modperl_perl.c
+===================================================================
+--- src/modules/perl/modperl_perl.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_perl.c (.../trunk) (revision 630610)
+@@ -43,9 +43,9 @@
+ Perl_croak(aTHX_ "Usage: ModPerl::Util::exit(status=0)");
+ }
+ /* default: 0 */
+- status = items < 1 ? 0 : (int)SvIV(ST(0));
++ status = items < 1 ? 0 : (int)SvIV(ST(0));
+ modperl_perl_exit(aTHX_ status);
+-
++
+ XSRETURN_EMPTY;
+ }
+
+@@ -71,17 +71,17 @@
+ #endif
+ #ifndef WIN32
+ ids->uid = getuid();
+- ids->euid = geteuid();
+- ids->gid = getgid();
+- ids->egid = getegid();
++ ids->euid = geteuid();
++ ids->gid = getgid();
++ ids->egid = getegid();
+
+- MP_TRACE_r(MP_FUNC,
++ MP_TRACE_r(MP_FUNC,
+ "pid=%d, "
+ #ifdef MP_MAINTAIN_PPID
+ "ppid=%d, "
+ #endif
+ "uid=%" Uid_t_f ", euid=%" Uid_t_f ", "
+- "gid=%" Gid_t_f ", egid=%" Gid_t_f "\n",
++ "gid=%" Gid_t_f ", egid=%" Gid_t_f,
+ (int)ids->pid,
+ #ifdef MP_MAINTAIN_PPID
+ (int)ids->ppid,
+@@ -134,7 +134,7 @@
+ void modperl_perl_destruct(PerlInterpreter *perl)
+ {
+ char **orig_environ = NULL;
+- PTR_TBL_t *module_commands;
++ PTR_TBL_t *module_commands;
+ dTHXa(perl);
+
+ PERL_SET_CONTEXT(perl);
+@@ -200,8 +200,7 @@
+ }
+ }
+
+-#if !(PERL_REVISION == 5 && ( PERL_VERSION < 8 || \
+- (PERL_VERSION == 8 && PERL_SUBVERSION == 0))) && \
++#if !(MP_PERL_VERSION_AT_MOST(5, 8, 0)) && \
+ (defined(USE_HASH_SEED) || defined(USE_HASH_SEED_EXPLICIT))
+ #define MP_NEED_HASH_SEED_FIXUP
+ #endif
+@@ -212,7 +211,7 @@
+ #endif
+
+ /* see modperl_hash_seed_set() */
+-void modperl_hash_seed_init(apr_pool_t *p)
++void modperl_hash_seed_init(apr_pool_t *p)
+ {
+ #ifdef MP_NEED_HASH_SEED_FIXUP
+ char *s;
+@@ -254,11 +253,11 @@
+ * it randomizes if perl was compiled with ccflags -DUSE_HASH_SEED
+ * or -DUSE_HASH_SEED_EXPLICIT, in which case we need to tell perl
+ * to use the same seed everywhere */
+-void modperl_hash_seed_set(pTHX)
++void modperl_hash_seed_set(pTHX)
+ {
+ #ifdef MP_NEED_HASH_SEED_FIXUP
+ if (MP_init_hash_seed_set) {
+-#if PERL_REVISION == 5 && PERL_VERSION == 8 && PERL_SUBVERSION == 1
++#if MP_PERL_VERSION(5, 8, 1)
+ PL_hash_seed = MP_init_hash_seed;
+ PL_hash_seed_set = MP_init_hash_seed_set;
+ #else
+Index: src/modules/perl/modperl_tipool.c
+===================================================================
+--- src/modules/perl/modperl_tipool.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_tipool.c (.../trunk) (revision 630610)
+@@ -33,7 +33,7 @@
+
+ modperl_list_t *modperl_list_new()
+ {
+- modperl_list_t *listp =
++ modperl_list_t *listp =
+ (modperl_list_t *)malloc(sizeof(*listp));
+ memset(listp, '\0', sizeof(*listp));
+ return listp;
+@@ -123,7 +123,7 @@
+ #ifdef MP_TRACE
+ if (!tmp) {
+ /* should never happen */
+- MP_TRACE_i(MP_FUNC, "failed to find 0x%lx in list 0x%lx\n",
++ MP_TRACE_i(MP_FUNC, "failed to find 0x%lx in list 0x%lx",
+ (unsigned long)rlist, (unsigned long)list);
+ }
+ #endif
+@@ -189,7 +189,7 @@
+ modperl_tipool_add(tipool, item);
+ }
+
+- MP_TRACE_i(MP_FUNC, "start=%d, max=%d, min_spare=%d, max_spare=%d\n",
++ MP_TRACE_i(MP_FUNC, "start=%d, max=%d, min_spare=%d, max_spare=%d",
+ tipool->cfg->start, tipool->cfg->max,
+ tipool->cfg->min_spare, tipool->cfg->max_spare);
+
+@@ -211,7 +211,7 @@
+ }
+
+ if (tipool->busy) {
+- MP_TRACE_i(MP_FUNC, "ERROR: %d items still in use\n",
++ MP_TRACE_i(MP_FUNC, "ERROR: %d items still in use",
+ tipool->in_use);
+ }
+
+@@ -231,7 +231,7 @@
+
+ tipool->size++;
+
+- MP_TRACE_i(MP_FUNC, "added 0x%lx (size=%d)\n",
++ MP_TRACE_i(MP_FUNC, "added 0x%lx (size=%d)",
+ (unsigned long)listp, tipool->size);
+ }
+
+@@ -242,7 +242,7 @@
+ tipool->idle = modperl_list_remove(tipool->idle, listp);
+
+ tipool->size--;
+- MP_TRACE_i(MP_FUNC, "removed 0x%lx (size=%d)\n",
++ MP_TRACE_i(MP_FUNC, "removed 0x%lx (size=%d)",
+ (unsigned long)listp, tipool->size);
+ }
+
+@@ -255,7 +255,7 @@
+ if (tipool->size == tipool->in_use) {
+ if (tipool->size < tipool->cfg->max) {
+ MP_TRACE_i(MP_FUNC,
+- "no idle items, size %d < %d max\n",
++ "no idle items, size %d < %d max",
+ tipool->size, tipool->cfg->max);
+ if (tipool->func->tipool_rgrow) {
+ void * item =
+@@ -277,7 +277,7 @@
+
+ /* XXX: this should never happen */
+ if (!head) {
+- MP_TRACE_i(MP_FUNC, "PANIC: no items available, %d of %d in use\n",
++ MP_TRACE_i(MP_FUNC, "PANIC: no items available, %d of %d in use",
+ tipool->in_use, tipool->size);
+ abort();
+ }
+@@ -318,14 +318,14 @@
+
+ #ifdef MP_TRACE
+ if (!tipool->busy && tipool->func->tipool_dump) {
+- MP_TRACE_i(MP_FUNC, "all items idle:\n");
++ MP_TRACE_i(MP_FUNC, "all items idle:");
+ MP_TRACE_i_do((*tipool->func->tipool_dump)(tipool,
+ tipool->data,
+ tipool->idle));
+ }
+ #endif
+
+- MP_TRACE_i(MP_FUNC, "0x%lx now available (%d in use, %d running)\n",
++ MP_TRACE_i(MP_FUNC, "0x%lx now available (%d in use, %d running)",
+ (unsigned long)listp->data, tipool->in_use, tipool->size);
+
+ if (tipool->in_use == (tipool->cfg->max - 1)) {
+@@ -341,11 +341,11 @@
+
+ if (max_spare) {
+ MP_TRACE_i(MP_FUNC,
+- "shrinking pool: max_spare=%d, only %d of %d in use\n",
++ "shrinking pool: max_spare=%d, only %d of %d in use",
+ tipool->cfg->max_spare, tipool->in_use, tipool->size);
+ }
+ else if (max_requests) {
+- MP_TRACE_i(MP_FUNC, "shrinking pool: max requests %d reached\n",
++ MP_TRACE_i(MP_FUNC, "shrinking pool: max requests %d reached",
+ tipool->cfg->max_requests);
+ }
+
+@@ -370,7 +370,7 @@
+ tipool->data);
+
+ MP_TRACE_i(MP_FUNC,
+- "growing pool: min_spare=%d, %d of %d in use\n",
++ "growing pool: min_spare=%d, %d of %d in use",
+ tipool->cfg->min_spare, tipool->in_use,
+ tipool->size);
+
+Index: src/modules/perl/modperl_perl.h
+===================================================================
+--- src/modules/perl/modperl_perl.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_perl.h (.../trunk) (revision 630610)
+@@ -22,7 +22,7 @@
+ * need to do that for those fake 5.8.0 as well. real 5.8.0 doesn't
+ * have THREADS_HAVE_PIDS defined.
+ */
+-#if PERL_REVISION == 5 && PERL_VERSION >= 8 && THREADS_HAVE_PIDS
++#if MP_PERL_VERSION_AT_LEAST(5, 8, 0) && THREADS_HAVE_PIDS
+ #define MP_MAINTAIN_PPID
+ #endif
+
+Index: src/modules/perl/modperl_io.c
+===================================================================
+--- src/modules/perl/modperl_io.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_io.c (.../trunk) (revision 630610)
+@@ -33,7 +33,7 @@
+
+ SvREFCNT_dec(obj); /* since sv_magic did SvREFCNT_inc */
+
+- MP_TRACE_r(MP_FUNC, "tie *%s(0x%lx) => %s, REFCNT=%d\n",
++ MP_TRACE_r(MP_FUNC, "tie *%s(0x%lx) => %s, REFCNT=%d",
+ GvNAME(handle), (unsigned long)handle, classname,
+ SvREFCNT(TIEHANDLE_SV(handle)));
+ }
+@@ -80,12 +80,12 @@
+ SV *sv = TIEHANDLE_SV(handle);
+
+ if (SvMAGICAL(sv) && (mg = mg_find(sv, PERL_MAGIC_tiedscalar))) {
+- char *package = HvNAME(SvSTASH((SV*)SvRV(mg->mg_obj)));
++ char *package = HvNAME(SvSTASH((SV*)SvRV(mg->mg_obj)));
+
+- if (!strEQ(package, classname)) {
+- MP_TRACE_r(MP_FUNC, "%s tied to %s\n", GvNAME(handle), package);
+- return TRUE;
+- }
++ if (!strEQ(package, classname)) {
++ MP_TRACE_r(MP_FUNC, "%s tied to %s", GvNAME(handle), package);
++ return TRUE;
++ }
+ }
+
+ return FALSE;
+@@ -95,7 +95,7 @@
+ {
+ #ifdef MP_TRACE
+ if (mg_find(TIEHANDLE_SV(handle), PERL_MAGIC_tiedscalar)) {
+- MP_TRACE_r(MP_FUNC, "untie *%s(0x%lx), REFCNT=%d\n",
++ MP_TRACE_r(MP_FUNC, "untie *%s(0x%lx), REFCNT=%d",
+ GvNAME(handle), (unsigned long)handle,
+ SvREFCNT(TIEHANDLE_SV(handle)));
+ }
+@@ -141,7 +141,7 @@
+ Perl_croak(aTHX_ "Failed to open STDIN: %" SVf, get_sv("!", TRUE));
+ }
+
+- MP_TRACE_o(MP_FUNC, "end\n");
++ MP_TRACE_o(MP_FUNC, "end");
+
+ return handle_save;
+ }
+@@ -184,7 +184,7 @@
+ Perl_croak(aTHX_ "Failed to open STDOUT: %" SVf, get_sv("!", TRUE));
+ }
+
+- MP_TRACE_o(MP_FUNC, "end\n");
++ MP_TRACE_o(MP_FUNC, "end");
+
+ /* XXX: shouldn't we preserve the value STDOUT had before it was
+ * overridden? */
+@@ -218,7 +218,7 @@
+ }
+
+ do_close(handle, FALSE);
+- (void)hv_delete(gv_stashpv("Apache2::RequestIO", TRUE),
++ (void)hv_delete(gv_stashpv("Apache2::RequestIO", TRUE),
+ GvNAME(handle), GvNAMELEN(handle), G_DISCARD);
+
+ if (err != Nullsv) {
+@@ -226,11 +226,11 @@
+ }
+ }
+
+- MP_TRACE_o(MP_FUNC, "end\n");
++ MP_TRACE_o(MP_FUNC, "end");
+ }
+
+ MP_INLINE void modperl_io_perlio_restore_stdout(pTHX_ GV *handle)
+-{
++{
+ GV *handle_orig = gv_fetchpv("STDOUT", FALSE, SVt_PVIO);
+
+ MP_TRACE_o(MP_FUNC, "start");
+@@ -265,7 +265,7 @@
+ }
+
+ do_close(handle, FALSE);
+- (void)hv_delete(gv_stashpv("Apache2::RequestIO", TRUE),
++ (void)hv_delete(gv_stashpv("Apache2::RequestIO", TRUE),
+ GvNAME(handle), GvNAMELEN(handle), G_DISCARD);
+
+ if (err != Nullsv) {
+@@ -273,5 +273,5 @@
+ }
+ }
+
+- MP_TRACE_o(MP_FUNC, "end\n");
++ MP_TRACE_o(MP_FUNC, "end");
+ }
+Index: src/modules/perl/modperl_tipool.h
+===================================================================
+--- src/modules/perl/modperl_tipool.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_tipool.h (.../trunk) (revision 630610)
+@@ -63,26 +63,26 @@
+ #define modperl_tipool_wait(tipool) \
+ while (tipool->size == tipool->in_use) { \
+ MP_TRACE_i(MP_FUNC, \
+- "waiting for available tipool item in thread 0x%lx\n", \
++ "waiting for available tipool item in thread 0x%lx", \
+ MP_TIDF); \
+- MP_TRACE_i(MP_FUNC, "(%d items in use, %d alive)\n", \
++ MP_TRACE_i(MP_FUNC, "(%d items in use, %d alive)", \
+ tipool->in_use, tipool->size); \
+ COND_WAIT(&tipool->available, &tipool->tiplock); \
+ }
+
+ #define modperl_tipool_broadcast(tipool) \
+- MP_TRACE_i(MP_FUNC, "broadcast available tipool item\n"); \
++ MP_TRACE_i(MP_FUNC, "broadcast available tipool item"); \
+ COND_SIGNAL(&tipool->available)
+
+ #define modperl_tipool_lock(tipool) \
+- MP_TRACE_i(MP_FUNC, "about to lock tipool in thread 0x%lx\n", MP_TIDF); \
++ MP_TRACE_i(MP_FUNC, "about to lock tipool in thread 0x%lx", MP_TIDF); \
+ MUTEX_LOCK(&tipool->tiplock); \
+- MP_TRACE_i(MP_FUNC, "acquired tipool lock\n")
++ MP_TRACE_i(MP_FUNC, "acquired tipool lock")
+
+ #define modperl_tipool_unlock(tipool) \
+- MP_TRACE_i(MP_FUNC, "about to unlock tipool in thread 0x%lx\n", MP_TIDF); \
++ MP_TRACE_i(MP_FUNC, "about to unlock tipool in thread 0x%lx", MP_TIDF); \
+ MUTEX_UNLOCK(&tipool->tiplock); \
+- MP_TRACE_i(MP_FUNC, "released tipool lock\n")
++ MP_TRACE_i(MP_FUNC, "released tipool lock")
+
+ #endif /* USE_ITHREADS */
+
+Index: src/modules/perl/modperl_io.h
+===================================================================
+--- src/modules/perl/modperl_io.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_io.h (.../trunk) (revision 630610)
+@@ -24,7 +24,7 @@
+ * from living in the gv to the GvIOp(gv), so we have to deal
+ * with both to support 5.6.x
+ */
+-#if ((PERL_REVISION == 5) && (PERL_VERSION >= 7))
++#if MP_PERL_VERSION_AT_LEAST(5, 7, 0)
+ # define TIEHANDLE_SV(handle) (SV*)GvIOp((SV*)handle)
+ #else
+ # define TIEHANDLE_SV(handle) (SV*)handle
+@@ -62,15 +62,15 @@
+ #if defined(MP_IO_TIE_SFIO)
+ /* XXX */
+ #elif defined(MP_IO_TIE_PERLIO)
+-#define modperl_io_override_stdin modperl_io_perlio_override_stdin
+-#define modperl_io_override_stdout modperl_io_perlio_override_stdout
+-#define modperl_io_restore_stdin modperl_io_perlio_restore_stdin
+-#define modperl_io_restore_stdout modperl_io_perlio_restore_stdout
++#define modperl_io_override_stdin modperl_io_perlio_override_stdin
++#define modperl_io_override_stdout modperl_io_perlio_override_stdout
++#define modperl_io_restore_stdin modperl_io_perlio_restore_stdin
++#define modperl_io_restore_stdout modperl_io_perlio_restore_stdout
+ #else
+-#define modperl_io_override_stdin modperl_io_tie_stdin
+-#define modperl_io_override_stdout modperl_io_tie_stdout
+-#define modperl_io_restore_stdin modperl_io_handle_untie
+-#define modperl_io_restore_stdout modperl_io_handle_untie
++#define modperl_io_override_stdin modperl_io_tie_stdin
++#define modperl_io_override_stdout modperl_io_tie_stdout
++#define modperl_io_restore_stdin modperl_io_handle_untie
++#define modperl_io_restore_stdout modperl_io_handle_untie
+ #endif
+
+
+Index: src/modules/perl/modperl_perl_global.c
+===================================================================
+--- src/modules/perl/modperl_perl_global.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_perl_global.c (.../trunk) (revision 630610)
+@@ -194,7 +194,7 @@
+ av_store(mav, AvFILLp(mav)+1, sv);
+
+ /* print scalar @{ $PL_modglobal{$key}{$package} } */
+- MP_TRACE_g(MP_FUNC, "%s::%s av now has %d entries\n",
++ MP_TRACE_g(MP_FUNC, "%s::%s av now has %d entries",
+ package, (char*)gkey->name, 1+av_len(mav));
+
+ return 1;
+@@ -279,7 +279,7 @@
+ HvRITER(ohv) = hv_riter;
+ HvEITER(ohv) = hv_eiter;
+
+- hv_magic(hv, Nullgv, 'E');
++ hv_magic(hv, Nullgv, 'E');
+
+ TAINT_NOT;
+
+@@ -299,7 +299,7 @@
+ * at this point: modperl_env.c:modperl_env_const_vars[],
+ * PerlPassEnv and top-level PerlSetEnv
+ * XXX: still; could have have something faster than newHVhv()
+- * especially if we add another GVHV to the globals table that
++ * especially if we add another GVHV to the globals table that
+ * might have more entries
+ */
+
+Index: src/modules/perl/modperl_debug.c
+===================================================================
+--- src/modules/perl/modperl_debug.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_debug.c (.../trunk) (revision 630610)
+@@ -59,7 +59,7 @@
+ len = tmp_len;
+ }
+ }
+- }
++ }
+ /* dump the table with keys aligned */
+ fmt = Perl_form(aTHX_ "%%-%ds => %%s", len);
+
+@@ -68,7 +68,7 @@
+ continue;
+ }
+ modperl_trace(MP_FUNC, fmt, elts[i].key, elts[i].val);
+- }
++ }
+ modperl_trace(MP_FUNC, "");
+ }
+ #endif
+@@ -93,8 +93,7 @@
+ MP_TRACE_g(MP_FUNC, "| %s => 0x%lx", key, val);
+ }
+
+- MP_TRACE_g(MP_FUNC, "|-------- PL_modglobal --------\n");
++ MP_TRACE_g(MP_FUNC, "|-------- PL_modglobal --------");
+
+ }
+ #endif
+-
+Index: src/modules/perl/modperl_common_log.c
+===================================================================
+--- src/modules/perl/modperl_common_log.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_common_log.c (.../trunk) (revision 630610)
+@@ -30,7 +30,7 @@
+
+ unsigned long modperl_debug_level(void)
+ {
+- return debug_level;
++ return debug_level;
+ }
+
+ void modperl_trace_logfile_set(apr_file_t *logfile_new)
+Index: src/modules/perl/modperl_error.c
+===================================================================
+--- src/modules/perl/modperl_error.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_error.c (.../trunk) (revision 630610)
+@@ -62,7 +62,7 @@
+ * line - set to the callers line number
+ * func - set to the function name
+ */
+-void modperl_croak(pTHX_ apr_status_t rc, const char* func)
++void modperl_croak(pTHX_ apr_status_t rc, const char* func)
+ {
+ HV *stash;
+ HV *data;
+@@ -78,7 +78,7 @@
+ }
+
+ if (SvTRUE(ERRSV)) {
+- Perl_croak(aTHX_ "%s", SvPV_nolen(ERRSV));
++ Perl_croak(aTHX_ "%s", SvPV_nolen(ERRSV));
+ }
+
+ stash = gv_stashpvn("APR::Error", 10, FALSE);
+@@ -91,5 +91,5 @@
+ sv_setiv(*hv_fetch(data, "line", 4, 1), CopLINE(PL_curcop));
+ sv_setpv(*hv_fetch(data, "func", 4, 1), func);
+
+- Perl_croak(aTHX_ Nullch);
++ Perl_croak(aTHX_ Nullch);
+ }
+Index: src/modules/perl/modperl_perl_includes.h
+===================================================================
+--- src/modules/perl/modperl_perl_includes.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_perl_includes.h (.../trunk) (revision 630610)
+@@ -53,7 +53,6 @@
+ # define uid_t perl_uid_t
+ # define gid_t perl_gid_t
+ # ifdef exit
+-# define perl_exit exit
+ # undef exit
+ # endif
+ #endif
+@@ -68,27 +67,13 @@
+
+ #if defined(WIN32) && defined(USE_LARGE_FILES)
+ # ifdef malloc
+-# define perl_malloc malloc
+ # undef malloc
+ # endif
+ # ifdef free
+-# define perl_free free
+ # undef free
+ # endif
+ #endif
+
+-#if (PERL_REVISION == 5) && (PERL_VERSION == 6)
+-# define MP_PERL_5_6_x
+-#endif
+-
+-#if defined(MP_PERL_5_6_x) && (PERL_SUBVERSION == 0)
+-# define MP_PERL_5_6_0
+-#endif
+-
+-#if defined(MP_PERL_5_6_x) && (PERL_SUBVERSION == 1)
+-# define MP_PERL_5_6_1
+-#endif
+-
+ #include "modperl_perl_unembed.h"
+
+ /* avoiding -Wall warning */
+Index: src/modules/perl/modperl_error.h
+===================================================================
+--- src/modules/perl/modperl_error.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_error.h (.../trunk) (revision 630610)
+@@ -25,7 +25,7 @@
+ #define MODPERL_FILTER_ERROR APR_OS_START_USERERR + 1
+
+ /**
+- * return the string representation of the error code
++ * return the string representation of the error code
+ * @param rc error code
+ * @return the error string
+ *
+@@ -34,7 +34,7 @@
+ * called again (which could happen indirectly). If unsure, copy.
+ */
+ char *modperl_error_strerror(pTHX_ apr_status_t rc);
+-
++
+ void modperl_croak(pTHX_ apr_status_t rc, const char* func);
+
+ #define MP_RUN_CROAK(rc_run, func) STMT_START \
+Index: src/modules/perl/modperl_perl_pp.h
+===================================================================
+--- src/modules/perl/modperl_perl_pp.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_perl_pp.h (.../trunk) (revision 630610)
+@@ -17,7 +17,10 @@
+ #ifndef MODPERL_PERL_PP_H
+ #define MODPERL_PERL_PP_H
+
+-#if defined(USE_ITHREADS) && defined(MP_PERL_5_6_x)
++#define MP_PERL_BRANCH(r, v) \
++ (PERL_REVISION == r && PERL_VERSION == v)
++
++#if defined(USE_ITHREADS) && MP_PERL_BRANCH(5, 6)
+ # define MP_REFGEN_FIXUP
+ #endif
+
+Index: src/modules/perl/modperl_perl_unembed.h
+===================================================================
+--- src/modules/perl/modperl_perl_unembed.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_perl_unembed.h (.../trunk) (revision 630610)
+@@ -43,4 +43,3 @@
+ #undef list
+
+ #endif /* MODPERL_PERL_UNEMBED_H */
+-
+Index: src/modules/perl/mod_perl.c
+===================================================================
+--- src/modules/perl/mod_perl.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/mod_perl.c (.../trunk) (revision 630610)
+@@ -61,7 +61,7 @@
+
+ handles = modperl_xs_dl_handles_get(aTHX);
+
+- MP_TRACE_i(MP_FUNC, "destroying interpreter=0x%lx\n",
++ MP_TRACE_i(MP_FUNC, "destroying interpreter=0x%lx",
+ (unsigned long)perl);
+
+ modperl_perl_destruct(perl);
+@@ -165,8 +165,7 @@
+ dTHXa(perl);
+
+ /* 5.7.3+ has a built-in special ${^TAINT}, backport it to 5.6.0+ */
+-#if PERL_REVISION == 5 && \
+- (PERL_VERSION == 6 || (PERL_VERSION == 7 && PERL_SUBVERSION < 3))
++#if MP_PERL_VERSION_AT_MOST(5, 7, 2)
+ {
+ GV *gv = gv_fetchpv("\024AINT", GV_ADDMULTI, SVt_IV);
+ sv_setiv(GvSV(gv), PL_tainting);
+@@ -216,13 +215,13 @@
+ {
+ server_rec *base_server = modperl_global_get_server_rec();
+ const char *desc = modperl_server_desc(s, p);
+- if (base_server == s) {
++ if (base_server == s) {
+ MP_TRACE_i(MP_FUNC,
+- "starting the parent perl for the base server\n", desc);
++ "starting the parent perl for the base server", desc);
+ }
+ else {
+ MP_TRACE_i(MP_FUNC,
+- "starting the parent perl for vhost %s\n", desc);
++ "starting the parent perl for vhost %s", desc);
+ }
+ }
+ #endif
+@@ -266,7 +265,7 @@
+ PL_endav = Nullav;
+
+ /* This was fixed in 5.9.0/5.8.1 (17775), but won't compile after 19122 */
+-#if PERL_REVISION == 5 && PERL_VERSION == 8 && PERL_SUBVERSION == 0 && \
++#if MP_PERL_VERSION(5, 8, 0) && \
+ defined(USE_REENTRANT_API) && defined(HAS_CRYPT_R) && defined(__GLIBC__)
+ /* workaround perl5.8.0/glibc bug */
+ PL_reentrant_buffer->_crypt_struct.current_saltbits = 0;
+@@ -293,7 +292,7 @@
+
+ set_taint_var(perl);
+
+- MP_TRACE_i(MP_FUNC, "constructed interpreter=0x%lx\n",
++ MP_TRACE_i(MP_FUNC, "constructed interpreter=0x%lx",
+ (unsigned long)perl);
+
+ #ifdef MP_USE_GTOP
+@@ -352,7 +351,7 @@
+ const char *vhost = modperl_server_desc(s, p);
+
+ if (!scfg) {
+- MP_TRACE_i(MP_FUNC, "server %s has no mod_perl config\n", vhost);
++ MP_TRACE_i(MP_FUNC, "server %s has no mod_perl config", vhost);
+ return OK;
+ }
+
+@@ -360,11 +359,11 @@
+ base_server = modperl_global_get_server_rec();
+ }
+
+- MP_TRACE_i(MP_FUNC, "Init vhost %s: s=0x%lx, base_s=0x%lx\n",
++ MP_TRACE_i(MP_FUNC, "Init vhost %s: s=0x%lx, base_s=0x%lx",
+ vhost, s, base_server);
+
+ if (base_server == s) {
+- MP_TRACE_i(MP_FUNC, "base server is not vhost, skipping %s\n",
++ MP_TRACE_i(MP_FUNC, "base server is not vhost, skipping %s",
+ vhost);
+ return OK;
+ }
+@@ -380,14 +379,14 @@
+ #ifdef USE_ITHREADS
+
+ if (scfg->mip) {
+- MP_TRACE_i(MP_FUNC, "server %s already initialized\n", vhost);
++ MP_TRACE_i(MP_FUNC, "server %s already initialized", vhost);
+ return OK;
+ }
+
+ /* the base server could have mod_perl callbacks disabled, but it
+ * still needs perl to drive the vhosts */
+ if (!MpSrvENABLE(scfg) && s->is_virtual) {
+- MP_TRACE_i(MP_FUNC, "mod_perl disabled for server %s\n", vhost);
++ MP_TRACE_i(MP_FUNC, "mod_perl disabled for server %s", vhost);
+ scfg->mip = NULL;
+ return OK;
+ }
+@@ -402,7 +401,7 @@
+ if (MpSrvPARENT(scfg)) {
+ perl = modperl_startup(s, p);
+ MP_TRACE_i(MP_FUNC,
+- "created parent interpreter for VirtualHost %s\n",
++ "created parent interpreter for VirtualHost %s",
+ modperl_server_desc(s, p));
+ }
+ else {
+@@ -410,7 +409,7 @@
+ /* virtual host w/ +Clone gets its own mip */
+ if (MpSrvCLONE(scfg)) {
+ modperl_interp_init(s, p, perl);
+- }
++ }
+ #endif
+
+ if (!modperl_config_apply_PerlRequire(s, scfg, perl, p)) {
+@@ -428,7 +427,7 @@
+ * need to point to the base mip here if this vhost
+ * doesn't have its own
+ */
+- MP_TRACE_i(MP_FUNC, "%s mip inherited from %s\n",
++ MP_TRACE_i(MP_FUNC, "%s mip inherited from %s",
+ vhost, modperl_server_desc(base_server, p));
+ scfg->mip = base_scfg->mip;
+ }
+@@ -477,7 +476,7 @@
+ for (; s; s=s->next) {
+ MP_dSCFG(s);
+ if (!modperl_config_apply_PerlPostConfigRequire(s, scfg, p)) {
+- return FALSE;
++ return FALSE;
+ }
+ }
+ return TRUE;
+@@ -492,7 +491,7 @@
+ #endif /* MP_TRACE */
+
+ if (!modperl_threaded_mpm()) {
+- MP_TRACE_i(MP_FUNC, "no clones created for non-threaded mpm\n");
++ MP_TRACE_i(MP_FUNC, "no clones created for non-threaded mpm");
+ return;
+ }
+
+@@ -501,7 +500,7 @@
+ #ifdef MP_TRACE
+ char *name = modperl_server_desc(s, p);
+
+- MP_TRACE_i(MP_FUNC, "PerlInterpScope set to %s for %s\n",
++ MP_TRACE_i(MP_FUNC, "PerlInterpScope set to %s for %s",
+ modperl_interp_scope_desc(scfg->interp_scope), name);
+ #else
+ char *name = NULL;
+@@ -511,18 +510,18 @@
+ #ifdef MP_TRACE
+ if (scfg->mip == base_scfg->mip) {
+ MP_TRACE_i(MP_FUNC,
+- "%s interp pool inherited from %s\n",
++ "%s interp pool inherited from %s",
+ name, base_name);
+ }
+ else {
+ MP_TRACE_i(MP_FUNC,
+- "%s interp pool already initialized\n",
++ "%s interp pool already initialized",
+ name);
+ }
+ #endif /* MP_TRACE */
+ }
+ else {
+- MP_TRACE_i(MP_FUNC, "initializing interp pool for %s\n",
++ MP_TRACE_i(MP_FUNC, "initializing interp pool for %s",
+ name);
+ modperl_tipool_init(scfg->mip->tipool);
+ }
+@@ -534,7 +533,7 @@
+ {
+ ap_mpm_query(AP_MPMQ_IS_THREADED, &MP_threaded_mpm);
+
+- MP_TRACE_g(MP_FUNC, "mod_perl globals are configured\n");
++ MP_TRACE_g(MP_FUNC, "mod_perl globals are configured");
+
+ modperl_global_init_pconf(pconf, pconf);
+ modperl_global_init_server_rec(pconf, s);
+@@ -554,7 +553,7 @@
+ int argc = 0;
+ char **argv = NULL, **env = NULL;
+
+- MP_TRACE_i(MP_FUNC, "mod_perl sys init\n");
++ MP_TRACE_i(MP_FUNC, "mod_perl sys init");
+
+ /* not every OS uses those vars in PERL_SYS_INIT3 macro */
+ argc = argc; argv = argv; env = env;
+@@ -584,13 +583,18 @@
+
+ static apr_status_t modperl_sys_term(void *data)
+ {
++ /* PERL_SYS_TERM() needs 'my_perl' as of 5.9.5 */
++#if MP_PERL_VERSION_AT_LEAST(5, 9, 5) && defined(USE_ITHREADS)
++ modperl_cleanup_data_t *cdata = (modperl_cleanup_data_t *)data;
++ PerlInterpreter *my_perl = cdata == NULL ? NULL : (PerlInterpreter *)cdata->data;
++#endif
+ MP_init_status = 0;
+ MP_threads_started = 0;
+ MP_post_post_config_phase = 0;
+
+ MP_PERL_FREE_THREAD_KEY_WORKAROUND;
+
+- MP_TRACE_i(MP_FUNC, "mod_perl sys term\n");
++ MP_TRACE_i(MP_FUNC, "mod_perl sys term");
+
+ modperl_env_unload();
+
+@@ -601,14 +605,14 @@
+ return APR_SUCCESS;
+ }
+
+-int modperl_hook_init(apr_pool_t *pconf, apr_pool_t *plog,
++int modperl_hook_init(apr_pool_t *pconf, apr_pool_t *plog,
+ apr_pool_t *ptemp, server_rec *s)
+ {
+ if (MP_IS_STARTING || MP_IS_RUNNING) {
+ return OK;
+ }
+
+- MP_TRACE_i(MP_FUNC, "mod_perl hook init\n");
++ MP_TRACE_i(MP_FUNC, "mod_perl hook init");
+
+ MP_init_status = 1; /* now starting */
+
+@@ -703,12 +707,12 @@
+ }
+ #endif
+
+-#if PERL_REVISION == 5 && PERL_VERSION < 9
++#if MP_PERL_VERSION_AT_LEAST(5, 9, 0)
++#define MP_PERL_VERSION_STAMP "Perl/%" SVf
++#else
+ #define MP_PERL_VERSION_STAMP "Perl/v%vd"
+-#else
+-#define MP_PERL_VERSION_STAMP "Perl/%" SVf
+ #endif
+-
++
+ ap_add_version_component(pconf, MP_VERSION_STRING);
+ ap_add_version_component(pconf,
+ Perl_form(aTHX_ MP_PERL_VERSION_STAMP,
+@@ -754,7 +758,7 @@
+ }
+
+ static int modperl_hook_header_parser(request_rec *r)
+-{
++{
+ /* if 'PerlOptions +GlobalRequest' is inside a container */
+ modperl_global_request_cfg_set(r);
+
+@@ -831,6 +835,7 @@
+
+ #ifdef USE_ITHREADS
+ APR_REGISTER_OPTIONAL_FN(modperl_interp_unselect);
++ APR_REGISTER_OPTIONAL_FN(modperl_thx_interp_get);
+ #endif
+
+ /* for <IfDefine MODPERL2> and Apache2->define("MODPERL2") */
+@@ -896,7 +901,7 @@
+ modperl_register_handler_hooks();
+ }
+
+-static const command_rec modperl_cmds[] = {
++static const command_rec modperl_cmds[] = {
+ MP_CMD_SRV_ITERATE("PerlSwitches", switches, "Perl Switches"),
+ MP_CMD_DIR_ITERATE("PerlModule", modules, "PerlModule"),
+ MP_CMD_DIR_ITERATE("PerlRequire", requires, "PerlRequire"),
+@@ -952,8 +957,8 @@
+ "Turn on -w switch"),
+ #endif
+ MP_CMD_ENTRIES,
+- { NULL },
+-};
++ { NULL },
++};
+
+ void modperl_response_init(request_rec *r)
+ {
+@@ -1011,6 +1016,7 @@
+ int modperl_response_handler(request_rec *r)
+ {
+ MP_dDCFG;
++ MP_dRCFG;
+ apr_status_t retval;
+
+ #ifdef USE_ITHREADS
+@@ -1025,6 +1031,9 @@
+ #ifdef USE_ITHREADS
+ interp = modperl_interp_select(r, r->connection, r->server);
+ aTHX = interp->perl;
++ if (MpInterpPUTBACK(interp)) {
++ rcfg->interp = interp;
++ }
+ #endif
+
+ /* default is -SetupEnv, add if PerlOption +SetupEnv */
+@@ -1037,6 +1046,7 @@
+ #ifdef USE_ITHREADS
+ if (MpInterpPUTBACK(interp)) {
+ /* PerlInterpScope handler */
++ rcfg->interp = NULL;
+ modperl_interp_unselect(interp);
+ }
+ #endif
+@@ -1133,7 +1143,7 @@
+ }
+
+ module AP_MODULE_DECLARE_DATA perl_module = {
+- STANDARD20_MODULE_STUFF,
++ STANDARD20_MODULE_STUFF,
+ modperl_config_dir_create, /* dir config creater */
+ modperl_config_dir_merge, /* dir merger --- default is to override */
+ modperl_config_srv_create, /* server config */
+Index: src/modules/perl/mod_perl.h
+===================================================================
+--- src/modules/perl/mod_perl.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/mod_perl.h (.../trunk) (revision 630610)
+@@ -55,7 +55,7 @@
+
+ /* apr largefile support is enabled, perl support is disabled */
+ #if (!defined(USE_LARGE_FILES)) && APR_HAS_LARGE_FILES
+-#define MP_LARGE_FILES_APR_ONLY
++#define MP_LARGE_FILES_APR_ONLY
+ #endif
+
+ /* conflict due to not have either both perl and apr
+@@ -103,7 +103,7 @@
+ Perl_croak(aTHX_ "Can't run '%s' in the threaded " \
+ "environment after server startup", what); \
+ }
+-
++
+ #define MP_CROAK_IF_THREADED_MPM(what) \
+ if (modperl_threaded_mpm()) { \
+ Perl_croak(aTHX_ "Can't run '%s' in a threaded mpm", \
+@@ -122,7 +122,7 @@
+ void modperl_init_globals(server_rec *s, apr_pool_t *pconf);
+ int modperl_run(void);
+ int modperl_is_running(void);
+-int modperl_hook_init(apr_pool_t *pconf, apr_pool_t *plog,
++int modperl_hook_init(apr_pool_t *pconf, apr_pool_t *plog,
+ apr_pool_t *ptemp, server_rec *s);
+ int modperl_hook_pre_config(apr_pool_t *p, apr_pool_t *plog,
+ apr_pool_t *ptemp);
+@@ -138,11 +138,6 @@
+ int modperl_response_handler(request_rec *r);
+ int modperl_response_handler_cgi(request_rec *r);
+
+-/* betting on Perl*Handlers not using CvXSUBANY
+- * mod_perl reuses this field for handler attributes
+- */
+-#define MP_CODE_ATTRS(cv) (CvXSUBANY((CV*)cv).any_i32)
+-
+ #define MgTypeExt(mg) (mg->mg_type == '~')
+
+ typedef void MP_FUNC_NONSTD_T(modperl_var_modify_t) (apr_table_t *,
+@@ -153,7 +148,10 @@
+ /* we need to hook a few internal things before APR_HOOK_REALLY_FIRST */
+ #define MODPERL_HOOK_REALLY_REALLY_FIRST (-20)
+
++#ifdef USE_ITHREADS
+ APR_DECLARE_OPTIONAL_FN(apr_status_t,modperl_interp_unselect,(void *));
++APR_DECLARE_OPTIONAL_FN(modperl_interp_t *,modperl_thx_interp_get,(PerlInterpreter *));
++#endif
+
+ /*
+ * perl context overriding and restoration is required when
+Index: src/modules/perl/modperl_svptr_table.c
+===================================================================
+--- src/modules/perl/modperl_svptr_table.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_svptr_table.c (.../trunk) (revision 630610)
+@@ -29,7 +29,7 @@
+
+ #ifdef USE_ITHREADS
+
+-#ifdef MP_PERL_5_6_x
++#if MP_PERL_BRANCH(5, 6)
+ # define my_sv_dup(s, p) sv_dup(s)
+
+ typedef struct {
+@@ -55,8 +55,8 @@
+ CLONE_PARAMS parms;
+
+ Newz(0, tbl, 1, PTR_TBL_t);
+- tbl->tbl_max = source->tbl_max;
+- tbl->tbl_items = source->tbl_items;
++ tbl->tbl_max = source->tbl_max;
++ tbl->tbl_items = source->tbl_items;
+ Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t *);
+
+ dst_ary = tbl->tbl_ary;
+@@ -67,13 +67,13 @@
+ parms.stashes = newAV();
+
+ for (i=0; i < source->tbl_max; i++, dst_ary++, src_ary++) {
+- PTR_TBL_ENT_t *src_ent, *dst_ent=NULL;
++ PTR_TBL_ENT_t *src_ent, *dst_ent=NULL;
+
+- if (!*src_ary) {
+- continue;
++ if (!*src_ary) {
++ continue;
+ }
+
+- for (src_ent = *src_ary;
++ for (src_ent = *src_ary;
+ src_ent;
+ src_ent = src_ent->next)
+ {
+@@ -110,13 +110,13 @@
+ PTR_TBL_ENT_t **ary = tbl->tbl_ary;
+
+ for (i=0; i < tbl->tbl_max; i++, ary++) {
+- PTR_TBL_ENT_t *ent;
++ PTR_TBL_ENT_t *ent;
+
+- if (!*ary) {
+- continue;
++ if (!*ary) {
++ continue;
+ }
+
+- for (ent = *ary; ent; ent = ent->next) {
++ for (ent = *ary; ent; ent = ent->next) {
+ if (!ent->newval) {
+ continue;
+ }
+@@ -143,13 +143,13 @@
+ entry = *oentry;
+
+ for (; entry; oentry = &entry->next, entry = *oentry) {
+- if (entry->oldval == key) {
++ if (entry->oldval == key) {
+ *oentry = entry->next;
+ SvREFCNT_dec((SV*)entry->newval);
+ Safefree(entry);
+ tbl->tbl_items--;
+- return;
+- }
++ return;
++ }
+ }
+ }
+
+@@ -168,8 +168,8 @@
+ {
+ PTR_TBL_t *tbl;
+ Newz(0, tbl, 1, PTR_TBL_t);
+- tbl->tbl_max = 511;
+- tbl->tbl_items = 0;
++ tbl->tbl_max = 511;
++ tbl->tbl_items = 0;
+ Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
+ return tbl;
+ }
+@@ -184,8 +184,8 @@
+ assert(tbl);
+ tblent = tbl->tbl_ary[hash & tbl->tbl_max];
+ for (; tblent; tblent = tblent->next) {
+- if (tblent->oldval == sv)
+- return tblent->newval;
++ if (tblent->oldval == sv)
++ return tblent->newval;
+ }
+ return (void*)NULL;
+ }
+@@ -205,10 +205,10 @@
+ assert(tbl);
+ otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
+ for (tblent = *otblent; tblent; i=0, tblent = tblent->next) {
+- if (tblent->oldval == oldv) {
+- tblent->newval = newv;
+- return;
+- }
++ if (tblent->oldval == oldv) {
++ tblent->newval = newv;
++ return;
++ }
+ }
+ Newz(0, tblent, 1, PTR_TBL_ENT_t);
+ tblent->oldval = oldv;
+@@ -217,7 +217,7 @@
+ *otblent = tblent;
+ tbl->tbl_items++;
+ if (i && tbl->tbl_items > tbl->tbl_max)
+- modperl_svptr_table_split(aTHX_ tbl);
++ modperl_svptr_table_split(aTHX_ tbl);
+ }
+
+ /* double the hash bucket size of an existing ptr table */
+@@ -235,20 +235,20 @@
+ tbl->tbl_max = --newsize;
+ tbl->tbl_ary = ary;
+ for (i=0; i < oldsize; i++, ary++) {
+- PTR_TBL_ENT_t **curentp, **entp, *ent;
+- if (!*ary)
+- continue;
+- curentp = ary + oldsize;
+- for (entp = ary, ent = *ary; ent; ent = *entp) {
+- if ((newsize & PTR2UV(ent->oldval)) != i) {
+- *entp = ent->next;
+- ent->next = *curentp;
+- *curentp = ent;
+- continue;
+- }
+- else
+- entp = &ent->next;
+- }
++ PTR_TBL_ENT_t **curentp, **entp, *ent;
++ if (!*ary)
++ continue;
++ curentp = ary + oldsize;
++ for (entp = ary, ent = *ary; ent; ent = *entp) {
++ if ((newsize & PTR2UV(ent->oldval)) != i) {
++ *entp = ent->next;
++ ent->next = *curentp;
++ *curentp = ent;
++ continue;
++ }
++ else
++ entp = &ent->next;
++ }
+ }
+ }
+
+Index: src/modules/perl/modperl_const.c
+===================================================================
+--- src/modules/perl/modperl_const.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_const.c (.../trunk) (revision 630610)
+@@ -117,7 +117,7 @@
+ }
+
+ classname = *(stashname + 1) == 'P'
+- ? "APR::Const"
++ ? "APR::Const"
+ : (*stashname == 'A' ? "Apache2::Const" : "ModPerl");
+ arg = SvPV(ST(1),n_a);
+
+Index: src/modules/perl/modperl_mgv.c
+===================================================================
+--- src/modules/perl/modperl_mgv.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_mgv.c (.../trunk) (revision 630610)
+@@ -64,7 +64,7 @@
+
+ #define modperl_mgv_hash(mgv) \
+ PERL_HASH(mgv->hash, mgv->name, mgv->len)
+- /* MP_TRACE_h(MP_FUNC, "%s...hash=%ld\n", mgv->name, mgv->hash) */
++ /* MP_TRACE_h(MP_FUNC, "%s...hash=%ld", mgv->name, mgv->hash) */
+
+ modperl_mgv_t *modperl_mgv_compile(pTHX_ apr_pool_t *p,
+ register const char *name)
+@@ -156,7 +156,7 @@
+ return gv;
+ }
+
+- /*
++ /*
+ * this VirtualHost has its own parent interpreter
+ * must require the module again with this server's THX
+ */
+@@ -247,31 +247,31 @@
+ if (SvROK(obj) && sv_isobject(obj)) {
+ stash = SvSTASH(SvRV(obj));
+ MpHandlerOBJECT_On(handler);
+- MP_TRACE_h(MP_FUNC, "handler object %s isa %s\n",
++ MP_TRACE_h(MP_FUNC, "handler object %s isa %s",
+ package, HvNAME(stash));
+ }
+ else {
+- MP_TRACE_h(MP_FUNC, "%s is not an object, pv=%s\n",
++ MP_TRACE_h(MP_FUNC, "%s is not an object, pv=%s",
+ package, SvPV_nolen(obj));
+ return 0;
+ }
+ }
+ else {
+- MP_TRACE_h(MP_FUNC, "failed to thaw %s\n", package);
++ MP_TRACE_h(MP_FUNC, "failed to thaw %s", package);
+ return 0;
+ }
+ }
+
+ if (!stash) {
+ if ((stash = gv_stashpvn(package, package_len, FALSE))) {
+- MP_TRACE_h(MP_FUNC, "handler method %s isa %s\n",
++ MP_TRACE_h(MP_FUNC, "handler method %s isa %s",
+ name, HvNAME(stash));
+ }
+ }
+ }
+ else {
+ if ((cv = get_cv(name, FALSE))) {
+- handler->attrs = (U32)MP_CODE_ATTRS(cv);
++ handler->attrs = *modperl_code_attrs(aTHX_ cv);
+ handler->mgv_cv =
+ modperl_mgv_compile(aTHX_ p, HvNAME(GvSTASH(CvGV(cv))));
+ modperl_mgv_append(aTHX_ p, handler->mgv_cv, GvNAME(CvGV(cv)));
+@@ -284,11 +284,11 @@
+ if (!stash && MpHandlerAUTOLOAD(handler)) {
+ if (!modperl_perl_module_loaded(aTHX_ name)) { /* not in %INC */
+ MP_TRACE_h(MP_FUNC,
+- "package %s not in %INC, attempting to load it\n",
++ "package %s not in %INC, attempting to load it",
+ name);
+
+ if (modperl_require_module(aTHX_ name, logfailure)) {
+- MP_TRACE_h(MP_FUNC, "loaded %s package\n", name);
++ MP_TRACE_h(MP_FUNC, "loaded %s package", name);
+ }
+ else {
+ if (logfailure) {
+@@ -297,13 +297,13 @@
+ }
+ else {
+ /* the caller handles the error checking */
+- MP_TRACE_h(MP_FUNC, "failed to load %s package\n", name);
++ MP_TRACE_h(MP_FUNC, "failed to load %s package", name);
+ return 0;
+ }
+ }
+ }
+ else {
+- MP_TRACE_h(MP_FUNC, "package %s seems to be loaded\n", name);
++ MP_TRACE_h(MP_FUNC, "package %s seems to be loaded", name);
+ }
+ }
+
+@@ -312,7 +312,7 @@
+ * module was loaded, preventing from loading the module
+ */
+ if (!(stash || (stash = gv_stashpv(name, FALSE)))) {
+- MP_TRACE_h(MP_FUNC, "%s's stash is not found\n", name);
++ MP_TRACE_h(MP_FUNC, "%s's stash is not found", name);
+ return 0;
+ }
+
+@@ -324,8 +324,8 @@
+ if (!stash) {
+ return 0;
+ }
+-
+-
++
++
+ if (MpHandlerMETHOD(handler) && !handler->mgv_obj) {
+ char *name = HvNAME(stash);
+ if (!name) {
+@@ -334,13 +334,13 @@
+ modperl_mgv_new_name(handler->mgv_obj, p, name);
+ }
+
+- handler->attrs = (U32)MP_CODE_ATTRS(cv);
++ handler->attrs = *modperl_code_attrs(aTHX_ cv);
+ /* note: this is the real function after @ISA lookup */
+ handler->mgv_cv = modperl_mgv_compile(aTHX_ p, HvNAME(GvSTASH(gv)));
+ modperl_mgv_append(aTHX_ p, handler->mgv_cv, handler_name);
+
+ MpHandlerPARSED_On(handler);
+- MP_TRACE_h(MP_FUNC, "[%s] found `%s' in class `%s' as a %s\n",
++ MP_TRACE_h(MP_FUNC, "[%s] found `%s' in class `%s' as a %s",
+ modperl_pid_tid(p),
+ handler_name, HvNAME(stash),
+ MpHandlerMETHOD(handler) ? "method" : "function");
+@@ -359,7 +359,7 @@
+ #ifdef MP_TRACE
+ /* complain only if the class was actually loaded/created */
+ if (stash) {
+- MP_TRACE_h(MP_FUNC, "`%s' not found in class `%s'\n",
++ MP_TRACE_h(MP_FUNC, "`%s' not found in class `%s'",
+ handler_name, name);
+ }
+ #endif
+@@ -418,7 +418,7 @@
+ modperl_mgv_as_string(aTHX_ symbol, p, 1);
+
+ if (modperl_require_module(aTHX_ package, TRUE)) {
+- MP_TRACE_h(MP_FUNC, "reloaded %s for server %s\n",
++ MP_TRACE_h(MP_FUNC, "reloaded %s for server %s",
+ package, modperl_server_desc(s, p));
+ return TRUE;
+ }
+@@ -452,7 +452,7 @@
+ #ifdef USE_ITHREADS
+ if ((MpSrvPARENT(scfg) && MpSrvAUTOLOAD(scfg))
+ && !modperl_mgv_lookup(aTHX_ handler->mgv_cv)) {
+- /*
++ /*
+ * this VirtualHost has its own parent interpreter
+ * must require the module again with this server's THX
+ */
+@@ -460,7 +460,7 @@
+ s, p);
+ }
+ #endif
+- MP_TRACE_h(MP_FUNC, "%s already resolved in server %s\n",
++ MP_TRACE_h(MP_FUNC, "%s already resolved in server %s",
+ modperl_handler_name(handler),
+ modperl_server_desc(s, p));
+ }
+Index: src/modules/perl/modperl_apr_compat.h
+===================================================================
+--- src/modules/perl/modperl_apr_compat.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_apr_compat.h (.../trunk) (revision 630610)
+@@ -109,7 +109,7 @@
+ #ifndef APR_FOPEN_READ
+ #define APR_FOPEN_READ APR_READ
+ #endif
+-#ifndef APR_FOPEN_WRITE
++#ifndef APR_FOPEN_WRITE
+ #define APR_FOPEN_WRITE APR_WRITE
+ #endif
+ #ifndef APR_FOPEN_CREATE
+@@ -124,16 +124,16 @@
+ #ifndef APR_FOPEN_BINARY
+ #define APR_FOPEN_BINARY APR_BINARY
+ #endif
+-#ifndef APR_FOPEN_EXCL
++#ifndef APR_FOPEN_EXCL
+ #define APR_FOPEN_EXCL APR_EXCL
+ #endif
+-#ifndef APR_FOPEN_BUFFERED
++#ifndef APR_FOPEN_BUFFERED
+ #define APR_FOPEN_BUFFERED APR_BUFFERED
+ #endif
+ #ifndef APR_FOPEN_DELONCLOSE
+ #define APR_FOPEN_DELONCLOSE APR_DELONCLOSE
+ #endif
+-#ifndef APR_FOPEN_XTHREAD
++#ifndef APR_FOPEN_XTHREAD
+ #define APR_FOPEN_XTHREAD APR_XTHREAD
+ #endif
+ #ifndef APR_FOPEN_SHARELOCK
+Index: src/modules/perl/modperl_callback.c
+===================================================================
+--- src/modules/perl/modperl_callback.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_callback.c (.../trunk) (revision 630610)
+@@ -88,7 +88,7 @@
+ name = handler->name;
+ }
+
+- MP_TRACE_h(MP_FUNC, "[%s %s] lookup of %s failed\n",
++ MP_TRACE_h(MP_FUNC, "[%s %s] lookup of %s failed",
+ modperl_pid_tid(p),
+ modperl_server_desc(s, p), name);
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
+@@ -112,7 +112,7 @@
+ if (status_sv == &PL_sv_undef) {
+ /* ModPerl::Util::exit() and Perl_croak internally
+ * arrange to return PL_sv_undef with G_EVAL|G_SCALAR */
+- status = OK;
++ status = OK;
+ }
+ else {
+ status = SvIVx(status_sv);
+@@ -163,7 +163,7 @@
+ AV *av_args = Nullav;
+
+ if (!MpSrvENABLE(scfg)) {
+- MP_TRACE_h(MP_FUNC, "PerlOff for server %s:%u\n",
++ MP_TRACE_h(MP_FUNC, "PerlOff for server %s:%u",
+ s->server_hostname, s->port);
+ return DECLINED;
+ }
+@@ -179,7 +179,7 @@
+ type, idx, FALSE, &desc);
+
+ if (!(avp && (av = *avp))) {
+- MP_TRACE_h(MP_FUNC, "no %s handlers configured (%s)\n",
++ MP_TRACE_h(MP_FUNC, "no %s handlers configured (%s)",
+ desc, r ? r->uri : "");
+ return DECLINED;
+ }
+@@ -254,14 +254,14 @@
+
+ modperl_callback_current_callback_set(desc);
+
+- MP_TRACE_h(MP_FUNC, "[%s] running %d %s handlers\n",
++ MP_TRACE_h(MP_FUNC, "[%s] running %d %s handlers",
+ modperl_pid_tid(p), av->nelts, desc);
+ handlers = (modperl_handler_t **)av->elts;
+
+ for (i=0; i<av->nelts; i++) {
+ status = modperl_callback(aTHX_ handlers[i], p, r, s, av_args);
+
+- MP_TRACE_h(MP_FUNC, "callback '%s' returned %d\n",
++ MP_TRACE_h(MP_FUNC, "callback '%s' returned %d",
+ modperl_handler_name(handlers[i]), status);
+
+ /* follow Apache's lead and let OK terminate the phase for
+@@ -290,7 +290,7 @@
+ break;
+ }
+ /* the normal case:
+- * OK and DECLINED continue
++ * OK and DECLINED continue
+ * errors end the phase
+ */
+ else if ((status != OK) && (status != DECLINED)) {
+@@ -299,7 +299,7 @@
+ #ifdef MP_TRACE
+ if (i+1 != av->nelts) {
+ MP_TRACE_h(MP_FUNC, "error status %d leaves %d "
+- "uncalled %s handlers\n",
++ "uncalled %s handlers",
+ status, av->nelts-i-1, desc);
+ }
+ #endif
+@@ -316,7 +316,7 @@
+ #ifdef MP_TRACE
+ if (i+1 != av->nelts) {
+ MP_TRACE_h(MP_FUNC, "OK ends the %s stack, "
+- "leaving %d uncalled %s handlers\n",
++ "leaving %d uncalled %s handlers",
+ desc, av->nelts-i-1, desc);
+ }
+ #endif
+@@ -327,7 +327,7 @@
+ #ifdef MP_TRACE
+ if (i+1 != av->nelts) {
+ MP_TRACE_h(MP_FUNC, "error status %d leaves %d "
+- "uncalled %s handlers\n",
++ "uncalled %s handlers",
+ status, av->nelts-i-1, desc);
+ }
+ #endif
+@@ -337,7 +337,7 @@
+ else {
+ /* the rare case.
+ * MP_HOOK_VOID handlers completely ignore the return status
+- * Apache should handle whatever mod_perl returns,
++ * Apache should handle whatever mod_perl returns,
+ * so there is no need to mess with the status
+ */
+ }
+@@ -371,7 +371,7 @@
+ NULL, NULL, NULL, run_mode);
+ }
+
+-int modperl_callback_per_srv(int idx, request_rec *r,
++int modperl_callback_per_srv(int idx, request_rec *r,
+ modperl_hook_run_mode_e run_mode)
+ {
+ return modperl_callback_run_handlers(idx,
+@@ -380,7 +380,7 @@
+ NULL, NULL, NULL, run_mode);
+ }
+
+-int modperl_callback_connection(int idx, conn_rec *c,
++int modperl_callback_connection(int idx, conn_rec *c,
+ modperl_hook_run_mode_e run_mode)
+ {
+ return modperl_callback_run_handlers(idx,
+Index: src/modules/perl/modperl_common_debug.c
+===================================================================
+--- src/modules/perl/modperl_common_debug.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_common_debug.c (.../trunk) (revision 630610)
+@@ -17,4 +17,3 @@
+ /* This file must not contain any symbols from apache/mod_perl
+ * (apr and perl are OK) */
+ #include "modperl_common_includes.h"
+-
+Index: src/modules/perl/modperl_interp.c
+===================================================================
+--- src/modules/perl/modperl_interp.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_interp.c (.../trunk) (revision 630610)
+@@ -55,7 +55,7 @@
+ PerlInterpreter *perl)
+ {
+ UV clone_flags = CLONEf_KEEP_PTR_TABLE;
+- modperl_interp_t *interp =
++ modperl_interp_t *interp =
+ (modperl_interp_t *)malloc(sizeof(*interp));
+
+ memset(interp, '\0', sizeof(*interp));
+@@ -79,7 +79,7 @@
+
+ interp->perl = perl_clone(perl, clone_flags);
+
+-#if PERL_REVISION == 5 && PERL_VERSION == 8 && PERL_SUBVERSION == 0 && \
++#if MP_PERL_VERSION(5, 8, 0) && \
+ defined(USE_REENTRANT_API) && defined(HAS_CRYPT_R) && defined(__GLIBC__)
+ {
+ dTHXa(interp->perl);
+@@ -120,7 +120,7 @@
+ #endif
+ }
+
+- MP_TRACE_i(MP_FUNC, "0x%lx / perl: 0x%lx / parent perl: 0x%lx\n",
++ MP_TRACE_i(MP_FUNC, "0x%lx / perl: 0x%lx / parent perl: 0x%lx",
+ (unsigned long)interp, (unsigned long)interp->perl,
+ (unsigned long)perl);
+
+@@ -134,11 +134,11 @@
+
+ PERL_SET_CONTEXT(interp->perl);
+
+- MP_TRACE_i(MP_FUNC, "interp == 0x%lx / perl: 0x%lx\n",
++ MP_TRACE_i(MP_FUNC, "interp == 0x%lx / perl: 0x%lx",
+ (unsigned long)interp, (unsigned long)interp->perl);
+
+ if (MpInterpIN_USE(interp)) {
+- MP_TRACE_i(MP_FUNC, "*error - still in use!*\n");
++ MP_TRACE_i(MP_FUNC, "*error - still in use!*");
+ }
+
+ handles = modperl_xs_dl_handles_get(aTHX);
+@@ -166,16 +166,16 @@
+ head = modperl_tipool_pop(mip->tipool);
+ interp = (modperl_interp_t *)head->data;
+
+- MP_TRACE_i(MP_FUNC, "head == 0x%lx, parent == 0x%lx\n",
++ MP_TRACE_i(MP_FUNC, "head == 0x%lx, parent == 0x%lx",
+ (unsigned long)head, (unsigned long)mip->parent);
+
+- MP_TRACE_i(MP_FUNC, "selected 0x%lx (perl==0x%lx)\n",
++ MP_TRACE_i(MP_FUNC, "selected 0x%lx (perl==0x%lx)",
+ (unsigned long)interp,
+ (unsigned long)interp->perl);
+
+ #ifdef MP_TRACE
+ interp->tid = MP_TIDF;
+- MP_TRACE_i(MP_FUNC, "thread == 0x%lx\n", interp->tid);
++ MP_TRACE_i(MP_FUNC, "thread == 0x%lx", interp->tid);
+ #endif
+
+ MpInterpIN_USE_On(interp);
+@@ -196,7 +196,7 @@
+ /* multiple mips might share the same parent
+ * make sure its only destroyed once
+ */
+- MP_TRACE_i(MP_FUNC, "parent == 0x%lx\n",
++ MP_TRACE_i(MP_FUNC, "parent == 0x%lx",
+ (unsigned long)mip->parent);
+
+ modperl_interp_destroy(mip->parent);
+@@ -208,7 +208,7 @@
+ static void *interp_pool_grow(modperl_tipool_t *tipool, void *data)
+ {
+ modperl_interp_pool_t *mip = (modperl_interp_pool_t *)data;
+- MP_TRACE_i(MP_FUNC, "adding new interpreter to the pool\n");
++ MP_TRACE_i(MP_FUNC, "adding new interpreter to the pool");
+ return (void *)modperl_interp_new(mip, mip->parent->perl);
+ }
+
+@@ -223,7 +223,7 @@
+ {
+ while (listp) {
+ modperl_interp_t *interp = (modperl_interp_t *)listp->data;
+- MP_TRACE_i(MP_FUNC, "listp==0x%lx, interp==0x%lx, requests=%d\n",
++ MP_TRACE_i(MP_FUNC, "listp==0x%lx, interp==0x%lx, requests=%d",
+ (unsigned long)listp, (unsigned long)interp,
+ interp->num_requests);
+ listp = listp->next;
+@@ -244,10 +244,10 @@
+ apr_pool_t *server_pool = modperl_server_pool();
+ pTHX;
+ MP_dSCFG(s);
+- modperl_interp_pool_t *mip =
++ modperl_interp_pool_t *mip =
+ (modperl_interp_pool_t *)apr_pcalloc(p, sizeof(*mip));
+
+- MP_TRACE_i(MP_FUNC, "server=%s\n", modperl_server_desc(s, p));
++ MP_TRACE_i(MP_FUNC, "server=%s", modperl_server_desc(s, p));
+
+ if (modperl_threaded_mpm()) {
+ mip->tipool = modperl_tipool_new(p, scfg->interp_pool_cfg,
+@@ -275,7 +275,7 @@
+
+ if (interp->refcnt != 0) {
+ --interp->refcnt;
+- MP_TRACE_i(MP_FUNC, "interp=0x%lx, refcnt=%d\n",
++ MP_TRACE_i(MP_FUNC, "interp=0x%lx, refcnt=%d",
+ (unsigned long)interp, interp->refcnt);
+ return APR_SUCCESS;
+ }
+@@ -291,7 +291,7 @@
+ MpInterpIN_USE_Off(interp);
+ MpInterpPUTBACK_Off(interp);
+
+- MP_THX_INTERP_SET(interp->perl, NULL);
++ modperl_thx_interp_set(interp->perl, NULL);
+
+ modperl_tipool_putback_data(mip->tipool, data, interp->num_requests);
+
+@@ -343,7 +343,7 @@
+ modperl_interp_t *interp = NULL;
+
+ if (scfg && (is_startup || !modperl_threaded_mpm())) {
+- MP_TRACE_i(MP_FUNC, "using parent interpreter at %s\n",
++ MP_TRACE_i(MP_FUNC, "using parent interpreter at %s",
+ is_startup ? "startup" : "request time (non-threaded MPM)");
+
+ if (!scfg->mip) {
+@@ -360,11 +360,11 @@
+ interp = modperl_interp_get(s);
+ modperl_interp_pool_set(p, interp, TRUE);
+
+- MP_TRACE_i(MP_FUNC, "set interp in request time pool 0x%lx\n",
++ MP_TRACE_i(MP_FUNC, "set interp in request time pool 0x%lx",
+ (unsigned long)p);
+ }
+ else {
+- MP_TRACE_i(MP_FUNC, "found interp in request time pool 0x%lx\n",
++ MP_TRACE_i(MP_FUNC, "found interp in request time pool 0x%lx",
+ (unsigned long)p);
+ }
+ }
+@@ -386,7 +386,7 @@
+
+ if (!modperl_threaded_mpm()) {
+ MP_TRACE_i(MP_FUNC,
+- "using parent 0x%lx for non-threaded mpm (%s:%d)\n",
++ "using parent 0x%lx for non-threaded mpm (%s:%d)",
+ (unsigned long)scfg->mip->parent,
+ s->server_hostname, s->port);
+ /* XXX: if no VirtualHosts w/ PerlOptions +Parent we can skip this */
+@@ -412,11 +412,11 @@
+ * else scope must be per-connection
+ */
+
+- scope = (dcfg && !modperl_interp_scope_undef(dcfg)) ?
++ scope = (dcfg && !modperl_interp_scope_undef(dcfg)) ?
+ dcfg->interp_scope :
+ (r ? scfg->interp_scope : MP_INTERP_SCOPE_CONNECTION);
+
+- MP_TRACE_i(MP_FUNC, "scope is per-%s\n",
++ MP_TRACE_i(MP_FUNC, "scope is per-%s",
+ modperl_interp_scope_desc(scope));
+
+ /*
+@@ -448,7 +448,7 @@
+ "looking for interp in main request for %s...%s\n",
+ main_r->uri, interp ? "found" : "not found");
+ main_r = main_r->main;
+- }
++ }
+ }
+ else {
+ p = r->pool;
+@@ -490,7 +490,7 @@
+ else {
+ if (!p) {
+ /* should never happen */
+- MP_TRACE_i(MP_FUNC, "no pool\n");
++ MP_TRACE_i(MP_FUNC, "no pool");
+ return NULL;
+ }
+
+@@ -506,7 +506,7 @@
+ /* set context (THX) for this thread */
+ PERL_SET_CONTEXT(interp->perl);
+
+- MP_THX_INTERP_SET(interp->perl, interp);
++ modperl_thx_interp_set(interp->perl, interp);
+
+ return interp;
+ }
+@@ -575,6 +575,24 @@
+ }
+ }
+
++#define MP_THX_INTERP_KEY "modperl2::thx_interp_key"
++modperl_interp_t *modperl_thx_interp_get(PerlInterpreter *thx)
++{
++ modperl_interp_t *interp;
++ dTHXa(thx);
++ SV **svp = hv_fetch(PL_modglobal, MP_THX_INTERP_KEY, strlen(MP_THX_INTERP_KEY), 0);
++ if (!svp) return;
++ interp = INT2PTR(modperl_interp_t *, SvIV(*svp));
++ return interp;
++}
++
++void modperl_thx_interp_set(PerlInterpreter *thx, modperl_interp_t *interp)
++{
++ dTHXa(thx);
++ hv_store(PL_modglobal, MP_THX_INTERP_KEY, strlen(MP_THX_INTERP_KEY), newSViv(PTR2IV(interp)), 0);
++ return;
++}
++
+ #else
+
+ void modperl_interp_init(server_rec *s, apr_pool_t *p,
+Index: src/modules/perl/modperl_callback.h
+===================================================================
+--- src/modules/perl/modperl_callback.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_callback.h (.../trunk) (revision 630610)
+@@ -45,7 +45,7 @@
+ apr_pool_t *ptemp,
+ modperl_hook_run_mode_e run_mode);
+
+-int modperl_callback_per_dir(int idx, request_rec *r,
++int modperl_callback_per_dir(int idx, request_rec *r,
+ modperl_hook_run_mode_e run_mode);
+
+ int modperl_callback_per_srv(int idx, request_rec *r,
+Index: src/modules/perl/modperl_config.c
+===================================================================
+--- src/modules/perl/modperl_config.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_config.c (.../trunk) (revision 630610)
+@@ -22,8 +22,8 @@
+
+ dcfg->location = dir;
+
+- MP_TRACE_d(MP_FUNC, "dir %s\n", dir);
+-
++ MP_TRACE_d(MP_FUNC, "dir %s", dir);
++
+ #ifdef USE_ITHREADS
+ /* defaults to per-server scope */
+ dcfg->interp_scope = MP_INTERP_SCOPE_UNDEF;
+@@ -110,7 +110,7 @@
+ *add = (modperl_config_dir_t *)addv,
+ *mrg = modperl_config_dir_new(p);
+
+- MP_TRACE_d(MP_FUNC, "basev==0x%lx, addv==0x%lx, mrg==0x%lx\n",
++ MP_TRACE_d(MP_FUNC, "basev==0x%lx, addv==0x%lx, mrg==0x%lx",
+ (unsigned long)basev, (unsigned long)addv,
+ (unsigned long)mrg);
+
+@@ -140,20 +140,20 @@
+
+ modperl_config_req_t *modperl_config_req_new(request_rec *r)
+ {
+- modperl_config_req_t *rcfg =
++ modperl_config_req_t *rcfg =
+ (modperl_config_req_t *)apr_pcalloc(r->pool, sizeof(*rcfg));
+
+- MP_TRACE_d(MP_FUNC, "0x%lx\n", (unsigned long)rcfg);
++ MP_TRACE_d(MP_FUNC, "0x%lx", (unsigned long)rcfg);
+
+ return rcfg;
+ }
+
+ modperl_config_con_t *modperl_config_con_new(conn_rec *c)
+ {
+- modperl_config_con_t *ccfg =
++ modperl_config_con_t *ccfg =
+ (modperl_config_con_t *)apr_pcalloc(c->pool, sizeof(*ccfg));
+
+- MP_TRACE_d(MP_FUNC, "0x%lx\n", (unsigned long)ccfg);
++ MP_TRACE_d(MP_FUNC, "0x%lx", (unsigned long)ccfg);
+
+ return ccfg;
+ }
+@@ -182,13 +182,13 @@
+
+ #ifdef MP_USE_GTOP
+ scfg->gtop = modperl_gtop_new(p);
+-#endif
++#endif
+
+ /* make sure httpd's argv[0] is the first argument so $0 is
+ * correctly connected to the real thing */
+ modperl_config_srv_argv_push(s->process->argv[0]);
+
+- MP_TRACE_d(MP_FUNC, "new scfg: 0x%lx\n", (unsigned long)scfg);
++ MP_TRACE_d(MP_FUNC, "new scfg: 0x%lx", (unsigned long)scfg);
+
+ return scfg;
+ }
+@@ -205,7 +205,7 @@
+
+ dcfg->SetEnv = apr_table_make(p, 2);
+
+- MP_TRACE_d(MP_FUNC, "new dcfg: 0x%lx\n", (unsigned long)dcfg);
++ MP_TRACE_d(MP_FUNC, "new dcfg: 0x%lx", (unsigned long)dcfg);
+
+ return dcfg;
+ }
+@@ -253,12 +253,12 @@
+ modperl_init_globals(s, p);
+ }
+
+- MP_TRACE_d(MP_FUNC, "p=0x%lx, s=0x%lx, virtual=%d\n",
++ MP_TRACE_d(MP_FUNC, "p=0x%lx, s=0x%lx, virtual=%d",
+ p, s, s->is_virtual);
+
+ #ifdef USE_ITHREADS
+
+- scfg->interp_pool_cfg =
++ scfg->interp_pool_cfg =
+ (modperl_tipool_config_t *)
+ apr_pcalloc(p, sizeof(*scfg->interp_pool_cfg));
+
+@@ -286,7 +286,7 @@
+ *add = (modperl_config_srv_t *)addv,
+ *mrg = modperl_config_srv_new(p, add->server);
+
+- MP_TRACE_d(MP_FUNC, "basev==0x%lx, addv==0x%lx, mrg==0x%lx\n",
++ MP_TRACE_d(MP_FUNC, "basev==0x%lx, addv==0x%lx, mrg==0x%lx",
+ (unsigned long)basev, (unsigned long)addv,
+ (unsigned long)mrg);
+
+@@ -362,11 +362,6 @@
+
+ retval = modperl_callback_per_dir(MP_CLEANUP_HANDLER, r, MP_HOOK_RUN_ALL);
+
+- if (rcfg->pnotes) {
+- SvREFCNT_dec(rcfg->pnotes);
+- rcfg->pnotes = Nullhv;
+- }
+-
+ /* undo changes to %ENV caused by +SetupEnv, perl-script, or
+ * $r->subprocess_env, so the values won't persist */
+ if (MpReqSETUP_ENV(rcfg)) {
+@@ -405,7 +400,7 @@
+ entries = (char **)scfg->PerlModule->elts;
+ for (i = 0; i < scfg->PerlModule->nelts; i++){
+ if (modperl_require_module(aTHX_ entries[i], TRUE)){
+- MP_TRACE_d(MP_FUNC, "loaded Perl module %s for server %s\n",
++ MP_TRACE_d(MP_FUNC, "loaded Perl module %s for server %s",
+ entries[i], modperl_server_desc(s,p));
+ }
+ else {
+@@ -430,7 +425,7 @@
+ entries = (char **)scfg->PerlRequire->elts;
+ for (i = 0; i < scfg->PerlRequire->nelts; i++){
+ if (modperl_require_file(aTHX_ entries[i], TRUE)){
+- MP_TRACE_d(MP_FUNC, "loaded Perl file: %s for server %s\n",
++ MP_TRACE_d(MP_FUNC, "loaded Perl file: %s for server %s",
+ entries[i], modperl_server_desc(s,p));
+ }
+ else {
+@@ -463,14 +458,14 @@
+ MP_PERL_CONTEXT_RESTORE;
+
+ if (retval) {
+- MP_TRACE_d(MP_FUNC, "loaded Perl file: %s for server %s\n",
++ MP_TRACE_d(MP_FUNC, "loaded Perl file: %s for server %s",
+ requires[i]->file, modperl_server_desc(s, p));
+ }
+ else {
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
+ "Can't load Perl file: %s for server %s, exiting...",
+ requires[i]->file, modperl_server_desc(s, p));
+-
++
+ return FALSE;
+ }
+ }
+@@ -523,7 +518,7 @@
+ parms.limited = -1;
+ parms.server = s;
+ parms.override = override;
+- parms.path = path;
++ parms.path = apr_pstrdup(p, path);
+ parms.pool = p;
+ #ifdef MP_HTTPD_HAS_OVERRIDE_OPTS
+ if (override_options == MP_HTTPD_OVERRIDE_OPTS_UNSET) {
+@@ -570,14 +565,14 @@
+ return errmsg;
+ }
+
+-const char *modperl_config_insert_parms(pTHX_ cmd_parms *parms,
++const char *modperl_config_insert_parms(pTHX_ cmd_parms *parms,
+ SV *lines)
+ {
+- return modperl_config_insert(aTHX_
+- parms->server,
+- parms->pool,
++ return modperl_config_insert(aTHX_
++ parms->server,
++ parms->pool,
+ parms->temp_pool,
+- parms->override,
++ parms->override,
+ parms->path,
+ #ifdef MP_HTTPD_HAS_OVERRIDE_OPTS
+ parms->override_opts,
+@@ -623,7 +618,7 @@
+ return errmsg;
+ }
+
+- r->per_dir_config =
++ r->per_dir_config =
+ ap_merge_per_dir_configs(r->pool,
+ r->per_dir_config,
+ dconf);
+Index: src/modules/perl/modperl_interp.h
+===================================================================
+--- src/modules/perl/modperl_interp.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_interp.h (.../trunk) (revision 630610)
+@@ -24,33 +24,9 @@
+
+ #ifdef USE_ITHREADS
+
+-/*
+- * HvPMROOT will never be used by Perl with PL_modglobal.
+- * so we have stolen it as a quick way to stash the interp
+- * pointer.
+- *
+- * However in 5.9.3 HvPMROOT was completely removed, so we have moved
+- * to use another struct member that's hopefully won't be used by
+- * anybody else. But if we can find a better place to store the
+- * pointer to the current mod_perl interpreter object it'd be a much
+- * cleaner solution. of course it must be really fast.
+- */
+-#ifndef HvPMROOT
+-#define MP_THX_INTERP_GET(thx) \
+- (modperl_interp_t *) ((XPVMG*)SvANY(*Perl_Imodglobal_ptr(thx)))->xmg_magic
+-#else
+-#define MP_THX_INTERP_GET(thx) \
+- (modperl_interp_t *)HvPMROOT(*Perl_Imodglobal_ptr(thx))
+-#endif
++modperl_interp_t *modperl_thx_interp_get(PerlInterpreter *thx);
++void modperl_thx_interp_set(PerlInterpreter *thx, modperl_interp_t *interp);
+
+-#ifndef HvPMROOT
+-#define MP_THX_INTERP_SET(thx, interp) \
+- ((XPVMG*)SvANY(*Perl_Imodglobal_ptr(thx)))->xmg_magic = (MAGIC*)interp
+-#else
+-#define MP_THX_INTERP_SET(thx, interp) \
+- HvPMROOT(*Perl_Imodglobal_ptr(thx)) = (PMOP*)interp
+-#endif
+-
+ const char *modperl_interp_scope_desc(modperl_interp_scope_e scope);
+
+ void modperl_interp_clone_init(modperl_interp_t *interp);
+@@ -91,7 +67,7 @@
+
+ apr_status_t modperl_interp_pool_destroy(void *data);
+
+-typedef apr_status_t (*modperl_interp_mip_walker_t)(pTHX_
++typedef apr_status_t (*modperl_interp_mip_walker_t)(pTHX_
+ modperl_interp_pool_t *mip,
+ void *data);
+
+Index: src/modules/perl/modperl_io_apache.c
+===================================================================
+--- src/modules/perl/modperl_io_apache.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_io_apache.c (.../trunk) (revision 630610)
+@@ -98,7 +98,7 @@
+ {
+ /* XXX: we could return STDIN => 0, STDOUT => 1, but that wouldn't
+ * be correct, as the IO goes through the socket, may be we should
+- * return the filedescriptor of the socket?
++ * return the filedescriptor of the socket?
+ *
+ * -1 in this case indicates that the layer cannot provide fileno
+ */
+@@ -139,7 +139,7 @@
+
+ rv = modperl_wbucket_write(aTHX_ rcfg->wbucket, vbuf, &count);
+ if (rv != APR_SUCCESS) {
+- Perl_croak(aTHX_ modperl_error_strerror(aTHX_ rv));
++ Perl_croak(aTHX_ modperl_error_strerror(aTHX_ rv));
+ }
+ bytes += count;
+
+@@ -224,7 +224,7 @@
+ NULL, /* can't seek on STD{IN|OUT}, fail on call*/
+ NULL, /* can't tell on STD{IN|OUT}, fail on call*/
+ PerlIOApache_close,
+- PerlIOApache_flush,
++ PerlIOApache_flush,
+ PerlIOApache_noop_fail, /* fill */
+ PerlIOBase_eof,
+ PerlIOBase_error,
+@@ -274,7 +274,7 @@
+
+ rc = ap_get_brigade(r->input_filters, bb, AP_MODE_READBYTES,
+ APR_BLOCK_READ, len);
+- if (rc != APR_SUCCESS) {
++ if (rc != APR_SUCCESS) {
+ /* if we fail here, we want to stop trying to read data
+ * from the client.
+ */
+@@ -335,7 +335,3 @@
+
+ return total;
+ }
+-
+-
+-
+-
+Index: src/modules/perl/modperl_gtop.c
+===================================================================
+--- src/modules/perl/modperl_gtop.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_gtop.c (.../trunk) (revision 630610)
+@@ -31,7 +31,7 @@
+ }
+ else if (size < 1048576) {
+ apr_snprintf(size_string, MP_GTOP_SSS, "%dk",
+- (size + 512) / 1024);
++ (int)(size + 512) / 1024);
+ }
+ else if (size < 103809024) {
+ apr_snprintf(size_string, MP_GTOP_SSS, "%.1fM",
+@@ -39,7 +39,7 @@
+ }
+ else {
+ apr_snprintf(size_string, MP_GTOP_SSS, "%dM",
+- (size + 524288) / 1048576);
++ (int)(size + 524288) / 1048576);
+ }
+
+ return 1;
+@@ -53,7 +53,7 @@
+
+ modperl_gtop_t *modperl_gtop_new(apr_pool_t *p)
+ {
+- modperl_gtop_t *gtop =
++ modperl_gtop_t *gtop =
+ (modperl_gtop_t *)apr_pcalloc(p, sizeof(*gtop));
+
+ gtop->pid = getpid();
+@@ -83,8 +83,8 @@
+ #define SS_TYPE_AFTER 2
+ #define SS_TYPE_DIFF 3
+
+-/*
+- * XXX: this is pretty ugly,
++/*
++ * XXX: this is pretty ugly,
+ * but avoids allocating buffers for the size string
+ */
+ static void modperl_gtop_proc_mem_size_string(modperl_gtop_t *gtop, int type)
+@@ -110,7 +110,7 @@
+ #undef ss_call
+ }
+
+-void modperl_gtop_report_proc_mem(modperl_gtop_t *gtop,
++void modperl_gtop_report_proc_mem(modperl_gtop_t *gtop,
+ char *when, const char *func, char *msg)
+ {
+ #define ss_item(item) gtop->proc_mem_ss.item
+Index: src/modules/perl/modperl_types.h
+===================================================================
+--- src/modules/perl/modperl_types.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_types.h (.../trunk) (revision 630610)
+@@ -101,7 +101,6 @@
+ struct modperl_interp_pool_t {
+ server_rec *server;
+ modperl_tipool_t *tipool;
+- modperl_tipool_config_t *tipool_cfg;
+ modperl_interp_t *parent; /* from which to perl_clone() */
+ };
+
+@@ -193,10 +192,10 @@
+ * - a subroutine name for named subs
+ * - NULL for anon subs
+ */
+- const char *name;
++ const char *name;
+ CV *cv;
+ U8 flags;
+- U32 attrs;
++ U16 attrs;
+ modperl_handler_t *next;
+ };
+
+Index: src/modules/perl/modperl_config.h
+===================================================================
+--- src/modules/perl/modperl_config.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_config.h (.../trunk) (revision 630610)
+@@ -42,9 +42,15 @@
+
+ apr_status_t modperl_config_req_cleanup(void *data);
+
++/* use a subpool here to ensure that a PerlCleanupHandler is run before
++ * any other pool cleanup - suppools are destroyed first. Particularly a
++ * PerlCleanupHandler must run before request pnotes are dropped.
++ */
+ #define modperl_config_req_cleanup_register(r, rcfg) \
+ if (r && !MpReqCLEANUP_REGISTERED(rcfg)) { \
+- apr_pool_cleanup_register(r->pool, \
++ apr_pool_t *p; \
++ apr_pool_create(&p, r->pool); \
++ apr_pool_cleanup_register(p, \
+ (void*)r, \
+ modperl_config_req_cleanup, \
+ apr_pool_cleanup_null); \
+@@ -93,7 +99,7 @@
+
+ #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)
+@@ -151,7 +157,7 @@
+ ap_conf_vector_t *conf,
+ SV *lines);
+
+-const char *modperl_config_insert_parms(pTHX_ cmd_parms *parms,
++const char *modperl_config_insert_parms(pTHX_ cmd_parms *parms,
+ SV *lines);
+
+ const char *modperl_config_insert_server(pTHX_ server_rec *s, SV *lines);
+Index: src/modules/perl/modperl_bucket.c
+===================================================================
+--- src/modules/perl/modperl_bucket.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_bucket.c (.../trunk) (revision 630610)
+@@ -53,12 +53,12 @@
+ dTHXa(svbucket->perl);
+
+ if (!apr_bucket_shared_destroy(svbucket)) {
+- MP_TRACE_f(MP_FUNC, "bucket refcnt=%d\n",
++ MP_TRACE_f(MP_FUNC, "bucket refcnt=%d",
+ ((apr_bucket_refcount *)svbucket)->refcount);
+ return;
+ }
+
+- MP_TRACE_f(MP_FUNC, "sv=0x%lx, refcnt=%d\n",
++ MP_TRACE_f(MP_FUNC, "sv=0x%lx, refcnt=%d",
+ (unsigned long)svbucket->sv, SvREFCNT(svbucket->sv));
+
+ SvREFCNT_dec(svbucket->sv);
+@@ -66,7 +66,7 @@
+ apr_bucket_free(svbucket);
+ }
+
+-static
++static
+ apr_status_t modperl_bucket_sv_setaside(apr_bucket *bucket, apr_pool_t *pool)
+ {
+ modperl_bucket_sv_t *svbucket = bucket->data;
+@@ -111,7 +111,7 @@
+ apr_off_t offset,
+ apr_size_t len)
+ {
+- modperl_bucket_sv_t *svbucket;
++ modperl_bucket_sv_t *svbucket;
+
+ svbucket = apr_bucket_alloc(sizeof(*svbucket), bucket->list);
+
+@@ -139,14 +139,14 @@
+ (void)SvREFCNT_inc(svbucket->sv);
+ }
+
+- MP_TRACE_f(MP_FUNC, "sv=0x%lx, refcnt=%d\n",
++ MP_TRACE_f(MP_FUNC, "sv=0x%lx, refcnt=%d",
+ (unsigned long)svbucket->sv, SvREFCNT(svbucket->sv));
+
+ bucket->type = &modperl_bucket_sv_type;
+ return bucket;
+ }
+
+-apr_bucket *modperl_bucket_sv_create(pTHX_ apr_bucket_alloc_t *list, SV *sv,
++apr_bucket *modperl_bucket_sv_create(pTHX_ apr_bucket_alloc_t *list, SV *sv,
+ apr_off_t offset, apr_size_t len)
+ {
+ apr_bucket *bucket;
+Index: src/modules/perl/modperl_util.c
+===================================================================
+--- src/modules/perl/modperl_util.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_util.c (.../trunk) (revision 630610)
+@@ -194,7 +194,7 @@
+ {
+ SV *sv = newSV(0);
+
+- MP_TRACE_h(MP_FUNC, "sv_setref_pv(%s, 0x%lx)\n",
++ MP_TRACE_h(MP_FUNC, "sv_setref_pv(%s, 0x%lx)",
+ classname, (unsigned long)ptr);
+ sv_setref_pv(sv, classname, ptr);
+
+@@ -265,10 +265,10 @@
+ void **handles;
+
+ if (!librefs) {
+- MP_TRACE_r(MP_FUNC,
+- "Could not get @%s for unloading.\n",
++ MP_TRACE_r(MP_FUNC,
++ "Could not get @%s for unloading.",
+ dl_librefs);
+- return NULL;
++ return NULL;
+ }
+
+ if (!(AvFILL(librefs) >= 0)) {
+@@ -279,23 +279,23 @@
+ handles = (void **)malloc(sizeof(void *) * (AvFILL(librefs)+2));
+
+ for (i=0; i<=AvFILL(librefs); i++) {
+- void *handle;
+- SV *handle_sv = *av_fetch(librefs, i, FALSE);
+- SV *module_sv = *av_fetch(modules, i, FALSE);
++ void *handle;
++ SV *handle_sv = *av_fetch(librefs, i, FALSE);
++ SV *module_sv = *av_fetch(modules, i, FALSE);
+
+- if(!handle_sv) {
+- MP_TRACE_r(MP_FUNC,
+- "Could not fetch $%s[%d]!\n",
++ if(!handle_sv) {
++ MP_TRACE_r(MP_FUNC,
++ "Could not fetch $%s[%d]!",
+ dl_librefs, (int)i);
+- continue;
+- }
+- handle = INT2PTR(void *, SvIV(handle_sv));
++ continue;
++ }
++ handle = INT2PTR(void *, SvIV(handle_sv));
+
+- MP_TRACE_r(MP_FUNC, "%s dl handle == 0x%lx\n",
++ MP_TRACE_r(MP_FUNC, "%s dl handle == 0x%lx",
+ SvPVX(module_sv), (unsigned long)handle);
+- if (handle) {
+- handles[i] = handle;
+- }
++ if (handle) {
++ handles[i] = handle;
++ }
+ }
+
+ av_clear(modules);
+@@ -311,11 +311,11 @@
+ int i;
+
+ if (!handles) {
+- return;
++ return;
+ }
+
+ for (i=0; handles[i]; i++) {
+- MP_TRACE_r(MP_FUNC, "close 0x%lx\n", (unsigned long)handles[i]);
++ MP_TRACE_r(MP_FUNC, "close 0x%lx", (unsigned long)handles[i]);
+ modperl_sys_dlclose(handles[i]);
+ }
+
+@@ -344,7 +344,7 @@
+ sv_free((SV *)tmpav);
+ }
+
+-static void modperl_package_unload_dynamic(pTHX_ const char *package,
++static void modperl_package_unload_dynamic(pTHX_ const char *package,
+ I32 dl_index)
+ {
+ AV *librefs = get_av(dl_librefs, 0);
+@@ -356,7 +356,7 @@
+ modperl_av_remove_entry(aTHX_ get_av(dl_librefs, 0), dl_index);
+ modperl_av_remove_entry(aTHX_ get_av(dl_modules, 0), dl_index);
+
+- return;
++ return;
+ }
+
+ static int modperl_package_is_dynamic(pTHX_ const char *package,
+@@ -415,12 +415,12 @@
+
+ #ifdef HvREHASH
+ if (HvREHASH(hv)) {
+- PERL_HASH_INTERNAL(hash, key, klen);
++ PERL_HASH_INTERNAL(hash, key, klen);
+ }
+ else
+ #endif
+ if (!hash) {
+- PERL_HASH(hash, key, klen);
++ PERL_HASH(hash, key, klen);
+ }
+
+ entry = ((HE**)HvARRAY(hv))[hash & (I32)xhv->xhv_max];
+@@ -449,7 +449,7 @@
+ }
+ }
+
+-/* XXX: same as Perl_do_sprintf();
++/* XXX: same as Perl_do_sprintf();
+ * but Perl_do_sprintf() is not part of the "public" api
+ */
+ void modperl_perl_do_sprintf(pTHX_ SV *sv, I32 len, SV **sarg)
+@@ -476,20 +476,20 @@
+ AvFILLp(subs)+1, name);
+
+ for (i=0; i<=AvFILLp(subs); i++) {
+- CV *cv = (CV*)ary[i];
+- SV *atsv = ERRSV;
++ CV *cv = (CV*)ary[i];
++ SV *atsv = ERRSV;
+
+- PUSHMARK(PL_stack_sp);
+- call_sv((SV*)cv, G_EVAL|G_DISCARD);
++ PUSHMARK(PL_stack_sp);
++ call_sv((SV*)cv, G_EVAL|G_DISCARD);
+
+- if (SvCUR(atsv)) {
++ if (SvCUR(atsv)) {
+ Perl_sv_catpvf(aTHX_ atsv, "%s failed--call queue aborted",
+ name);
+- while (PL_scopestack_ix > oldscope) {
+- LEAVE;
++ while (PL_scopestack_ix > oldscope) {
++ LEAVE;
+ }
+ Perl_croak(aTHX_ "%s", SvPVX(atsv));
+- }
++ }
+ }
+ }
+
+@@ -497,7 +497,7 @@
+ {
+ ENTER;
+ SAVESPTR(PL_diehook);
+- PL_diehook = Nullsv;
++ PL_diehook = Nullsv;
+ modperl_croak(aTHX_ MODPERL_RC_EXIT, "ModPerl::Util::exit");
+ }
+
+@@ -506,7 +506,7 @@
+ {
+ SV *retval = &PL_sv_undef;
+
+- if (r && r->per_dir_config) {
++ if (r && r->per_dir_config) {
+ MP_dDCFG;
+ retval = modperl_table_get_set(aTHX_ dcfg->configvars,
+ key, sv_val, FALSE);
+@@ -532,31 +532,31 @@
+ {
+ SV *retval = &PL_sv_undef;
+
+- if (table == NULL) {
++ if (table == NULL) {
+ /* do nothing */
+ }
+- else if (key == NULL) {
++ else if (key == NULL) {
+ retval = modperl_hash_tie(aTHX_ "APR::Table",
+- Nullsv, (void*)table);
++ Nullsv, (void*)table);
+ }
+ else if (!sv_val) { /* no val was passed */
+- char *val;
+- if ((val = (char *)apr_table_get(table, key))) {
+- retval = newSVpv(val, 0);
+- }
+- else {
+- retval = newSV(0);
+- }
+- if (do_taint) {
+- SvTAINTED_on(retval);
+- }
++ char *val;
++ if ((val = (char *)apr_table_get(table, key))) {
++ retval = newSVpv(val, 0);
++ }
++ else {
++ retval = newSV(0);
++ }
++ if (do_taint) {
++ SvTAINTED_on(retval);
++ }
+ }
+ else if (!SvOK(sv_val)) { /* val was passed in as undef */
+- apr_table_unset(table, key);
++ apr_table_unset(table, key);
+ }
+- else {
++ else {
+ apr_table_set(table, key, SvPV_nolen(sv_val));
+- }
++ }
+
+ return retval;
+ }
+@@ -629,10 +629,10 @@
+ rc = apr_file_read(file, SvPVX(sv), &size);
+ SLURP_SUCCESS("reading");
+
+- MP_TRACE_o(MP_FUNC, "read %d bytes from '%s'\n", size, r->filename);
++ MP_TRACE_o(MP_FUNC, "read %d bytes from '%s'", size, r->filename);
+
+ if (r->finfo.size != size) {
+- SvREFCNT_dec(sv);
++ SvREFCNT_dec(sv);
+ Perl_croak(aTHX_ "Error: read %d bytes, expected %d ('%s')",
+ size, (apr_size_t)r->finfo.size, r->filename);
+ }
+@@ -706,10 +706,10 @@
+
+ SV *modperl_apr_array_header2avrv(pTHX_ apr_array_header_t *array)
+ {
+- AV *av = newAV();
++ AV *av = newAV();
+
+ if (array) {
+- int i;
++ int i;
+ for (i = 0; i < array->nelts; i++) {
+ av_push(av, newSVpv(((char **)array->elts)[i], 0));
+ }
+@@ -742,7 +742,7 @@
+ }
+
+ /* Remove a package from %INC */
+-static void modperl_package_delete_from_inc(pTHX_ const char *package)
++static void modperl_package_delete_from_inc(pTHX_ const char *package)
+ {
+ int len;
+ char *filename = package2filename(package, &len);
+@@ -753,7 +753,7 @@
+ /* Destroy a package's stash */
+ #define MP_STASH_SUBSTASH(key, len) ((len >= 2) && \
+ (key[len-1] == ':') && \
+- (key[len-2] == ':'))
++ (key[len-2] == ':'))
+ #define MP_STASH_DEBUGGER(key, len) ((len >= 2) && \
+ (key[0] == '_') && \
+ (key[1] == '<'))
+@@ -819,7 +819,7 @@
+ *counter = 1;
+ apr_pool_userdata_set(counter, MP_RESTART_COUNT_KEY,
+ apr_pool_cleanup_null, p);
+- }
++ }
+ }
+
+ int modperl_restart_count(void)
+@@ -853,36 +853,35 @@
+ *pnotes = Nullhv;
+ }
+
+- return APR_SUCCESS;
++ return APR_SUCCESS;
+ }
+
+-SV *modperl_pnotes(pTHX_ HV **pnotes, SV *key, SV *val,
++MP_INLINE
++static void *modperl_pnotes_cleanup_data(pTHX_ HV **pnotes, apr_pool_t *p) {
++#ifdef USE_ITHREADS
++ modperl_cleanup_pnotes_data_t *cleanup_data = apr_palloc(p, sizeof(*cleanup_data));
++ cleanup_data->pnotes = pnotes;
++ cleanup_data->perl = aTHX;
++ return cleanup_data;
++#else
++ return pnotes;
++#endif
++}
++
++SV *modperl_pnotes(pTHX_ HV **pnotes, SV *key, SV *val,
+ request_rec *r, conn_rec *c) {
+ SV *retval = Nullsv;
+
+ if (!*pnotes) {
++ apr_pool_t *pool = r ? r->pool : c->pool;
++ void *cleanup_data;
+ *pnotes = newHV();
+
+- /* XXX: It would be nice to be able to do this with r->pnotes, but
+- * it's currently impossible, as modperl_config.c:modperl_config_request_cleanup()
+- * is responsible for running the CleanupHandlers, and it's cleanup callback is
+- * registered very early. If we register our cleanup here, we'll be running
+- * *before* the CleanupHandlers, and they might still want to use pnotes...
+- */
+- if (c && !r) {
+- apr_pool_t *pool = r ? r->pool : c->pool;
+-#ifdef USE_ITHREADS
+- modperl_cleanup_pnotes_data_t *cleanup_data =
+- apr_palloc(pool, sizeof(*cleanup_data));
+- cleanup_data->pnotes = pnotes;
+- cleanup_data->perl = aTHX;
+-#else
+- void *cleanup_data = pnotes;
+-#endif
+- apr_pool_cleanup_register(pool, cleanup_data,
+- modperl_cleanup_pnotes,
+- apr_pool_cleanup_null);
+- }
++ cleanup_data = modperl_pnotes_cleanup_data(aTHX_ pnotes, pool);
++
++ apr_pool_cleanup_register(pool, cleanup_data,
++ modperl_cleanup_pnotes,
++ apr_pool_cleanup_null);
+ }
+
+ if (key) {
+@@ -895,11 +894,19 @@
+ else if (hv_exists(*pnotes, k, len)) {
+ retval = *hv_fetch(*pnotes, k, len, FALSE);
+ }
++
++ return retval ? SvREFCNT_inc(retval) : &PL_sv_undef;
+ }
+- else {
+- retval = newRV_inc((SV *)*pnotes);
++ return newRV_inc((SV *)*pnotes);
++}
++
++U16 *modperl_code_attrs(pTHX_ CV *cv) {
++ MAGIC *mg;
++
++ if (!SvMAGICAL(cv)) {
++ sv_magic((SV*)cv, Nullsv, PERL_MAGIC_ext, NULL, -1);
+ }
+
+- return retval ? SvREFCNT_inc(retval) : &PL_sv_undef;
++ mg = mg_find((SV*)cv, PERL_MAGIC_ext);
++ return &(mg->mg_private);
+ }
+-
+Index: src/modules/perl/modperl_gtop.h
+===================================================================
+--- src/modules/perl/modperl_gtop.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_gtop.h (.../trunk) (revision 630610)
+@@ -43,7 +43,7 @@
+ char share[MP_GTOP_SSS];
+ char rss[MP_GTOP_SSS];
+ } modperl_gtop_proc_mem_ss;
+-
++
+ typedef struct {
+ glibtop_union before;
+ glibtop_union after;
+@@ -54,7 +54,7 @@
+ modperl_gtop_t *modperl_gtop_new(apr_pool_t *p);
+ void modperl_gtop_get_proc_mem_before(modperl_gtop_t *gtop);
+ void modperl_gtop_get_proc_mem_after(modperl_gtop_t *gtop);
+-void modperl_gtop_report_proc_mem(modperl_gtop_t *gtop,
++void modperl_gtop_report_proc_mem(modperl_gtop_t *gtop,
+ char *when, const char *func, char *msg);
+ void modperl_gtop_report_proc_mem_diff(modperl_gtop_t *gtop, const char* func, char *msg);
+ void modperl_gtop_report_proc_mem_before(modperl_gtop_t *gtop, const char* func, char *msg);
+Index: src/modules/perl/modperl_bucket.h
+===================================================================
+--- src/modules/perl/modperl_bucket.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_bucket.h (.../trunk) (revision 630610)
+@@ -17,7 +17,7 @@
+ #ifndef MODPERL_BUCKET_H
+ #define MODPERL_BUCKET_H
+
+-apr_bucket *modperl_bucket_sv_create(pTHX_ apr_bucket_alloc_t *list, SV *sv,
++apr_bucket *modperl_bucket_sv_create(pTHX_ apr_bucket_alloc_t *list, SV *sv,
+ apr_off_t offset, apr_size_t len);
+
+ #endif /* MODPERL_BUCKET_H */
+Index: src/modules/perl/modperl_util.h
+===================================================================
+--- src/modules/perl/modperl_util.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_util.h (.../trunk) (revision 630610)
+@@ -27,7 +27,7 @@
+ }
+
+ /* turn off cgi header parsing. in case we are already inside
+- * modperl_callback_per_dir(MP_RESPONSE_HANDLER, r, MP_HOOK_RUN_FIRST);
++ * modperl_callback_per_dir(MP_RESPONSE_HANDLER, r, MP_HOOK_RUN_FIRST);
+ * but haven't sent any data yet, it's too late to change
+ * MpReqPARSE_HEADERS, so change the wbucket's private flag directly
+ */
+@@ -35,7 +35,7 @@
+ MpReqPARSE_HEADERS_Off(rcfg); \
+ if (rcfg->wbucket) { \
+ rcfg->wbucket->header_parse = 0; \
+- }
++ }
+
+ MP_INLINE server_rec *modperl_sv2server_rec(pTHX_ SV *sv);
+ MP_INLINE request_rec *modperl_sv2request_rec(pTHX_ SV *sv);
+@@ -81,7 +81,7 @@
+
+ MP_INLINE SV *modperl_dir_config(pTHX_ request_rec *r, server_rec *s,
+ char *key, SV *sv_val);
+-
++
+ SV *modperl_table_get_set(pTHX_ apr_table_t *table, char *key,
+ SV *sv_val, int do_taint);
+
+@@ -149,4 +149,6 @@
+ SV *modperl_pnotes(pTHX_ HV **pnotes, SV *key, SV *val,
+ request_rec *r, conn_rec *c);
+
++U16 *modperl_code_attrs(pTHX_ CV *cv);
++
+ #endif /* MODPERL_UTIL_H */
+Index: src/modules/perl/modperl_env.c
+===================================================================
+--- src/modules/perl/modperl_env.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_env.c (.../trunk) (revision 630610)
+@@ -130,7 +130,7 @@
+ continue;
+ }
+ MP_ENV_HV_STORE_TABLE_ENTRY(hv, elts[i]);
+- }
++ }
+
+ modperl_env_tie(mg_flags);
+ }
+@@ -167,10 +167,10 @@
+ apr_table_entry_t *elts;
+ HV *hv = ENVHV;
+ SV **svp;
+-
++
+ array = apr_table_elts(table);
+ elts = (apr_table_entry_t *)array->elts;
+-
++
+ for (i = 0; i < array->nelts; i++) {
+ if (!elts[i].key) {
+ continue;
+@@ -181,7 +181,7 @@
+ MP_TRACE_e(MP_FUNC, "(Set|Pass)Env '%s' '%s'", elts[i].key,
+ SvPV_nolen(*svp));
+ }
+- }
++ }
+ TAINT_NOT; /* SvPV_* causes the taint issue */
+ }
+
+@@ -232,13 +232,13 @@
+ }
+ }
+
+- MP_TRACE_e(MP_FUNC, "\n\t[%s/0x%lx/%s]"
++ MP_TRACE_e(MP_FUNC, "\t[%s/0x%lx/%s]"
+ "\n\t@ENV{keys scfg->SetEnv} = values scfg->SetEnv;",
+ modperl_pid_tid(p), modperl_interp_address(aTHX),
+ modperl_server_desc(s, p));
+ modperl_env_table_populate(aTHX_ scfg->SetEnv);
+
+- MP_TRACE_e(MP_FUNC, "\n\t[%s/0x%lx/%s]"
++ MP_TRACE_e(MP_FUNC, "\t[%s/0x%lx/%s]"
+ "\n\t@ENV{keys scfg->PassEnv} = values scfg->PassEnv;",
+ modperl_pid_tid(p), modperl_interp_address(aTHX),
+ modperl_server_desc(s, p));
+@@ -255,7 +255,7 @@
+ MP_dRCFG;
+ MP_dDCFG;
+
+- /* populate %ENV and r->subprocess_env with per-directory
++ /* populate %ENV and r->subprocess_env with per-directory
+ * PerlSetEnv entries.
+ *
+ * note that per-server PerlSetEnv entries, as well as
+@@ -267,10 +267,10 @@
+ apr_table_t *setenv_copy;
+
+ /* add per-directory PerlSetEnv entries to %ENV
+- * collisions with per-server PerlSetEnv entries are
++ * collisions with per-server PerlSetEnv entries are
+ * resolved via the nature of a Perl hash
+ */
+- MP_TRACE_e(MP_FUNC, "\n\t[%s/0x%lx/%s]"
++ MP_TRACE_e(MP_FUNC, "\t[%s/0x%lx/%s]"
+ "\n\t@ENV{keys dcfg->SetEnv} = values dcfg->SetEnv;",
+ modperl_pid_tid(r->pool), modperl_interp_address(aTHX),
+ modperl_server_desc(r->server, r->pool));
+@@ -295,15 +295,15 @@
+ MP_dRCFG;
+ MP_dSCFG(r->server);
+
+- /* populate %ENV and r->subprocess_env with per-server PerlSetEnv
+- * and PerlPassEnv entries.
++ /* populate %ENV and r->subprocess_env with per-server PerlSetEnv
++ * and PerlPassEnv entries.
+ *
+ * although both are setup in %ENV in modperl_request_configure_server
+ * %ENV will be reset via modperl_env_request_unpopulate.
+ */
+
+ if (!apr_is_empty_table(scfg->SetEnv)) {
+- MP_TRACE_e(MP_FUNC, "\n\t[%s/0x%lx/%s]"
++ MP_TRACE_e(MP_FUNC, "\t[%s/0x%lx/%s]"
+ "\n\t@ENV{keys scfg->SetEnv} = values scfg->SetEnv;",
+ modperl_pid_tid(r->pool), modperl_interp_address(aTHX),
+ modperl_server_desc(r->server, r->pool));
+@@ -313,7 +313,7 @@
+ }
+
+ if (!apr_is_empty_table(scfg->PassEnv)) {
+- MP_TRACE_e(MP_FUNC, "\n\t[%s/0x%lx/%s]"
++ MP_TRACE_e(MP_FUNC, "\t[%s/0x%lx/%s]"
+ "\n\t@ENV{keys scfg->PassEnv} = values scfg->PassEnv;",
+ modperl_pid_tid(r->pool), modperl_interp_address(aTHX),
+ modperl_server_desc(r->server, r->pool));
+@@ -356,14 +356,14 @@
+ * normally, %ENV is only populated once per request (if at all) -
+ * just prior to content generation if +SetupEnv.
+ *
+- * however, in the $r->subprocess_env() case it will be called
++ * however, in the $r->subprocess_env() case it will be called
+ * more than once - once for each void call, and once again just
+ * prior to content generation. while costly, the multiple
+ * passes are required, otherwise void calls would prohibit later
+ * phases from populating %ENV with new subprocess_env table entries
+ */
+
+- MP_TRACE_e(MP_FUNC, "\n\t[%s/0x%lx/%s%s]"
++ MP_TRACE_e(MP_FUNC, "\t[%s/0x%lx/%s%s]"
+ "\n\t@ENV{keys r->subprocess_env} = values r->subprocess_env;",
+ modperl_pid_tid(r->pool), modperl_interp_address(aTHX),
+ modperl_server_desc(r->server, r->pool), r->uri);
+@@ -382,7 +382,7 @@
+
+ /* don't set up CGI variables again this request.
+ * this also triggers modperl_env_request_unpopulate, which
+- * resets %ENV between requests - see modperl_config_request_cleanup
++ * resets %ENV between requests - see modperl_config_request_cleanup
+ */
+ MpReqSETUP_ENV_On(rcfg);
+ }
+@@ -411,7 +411,7 @@
+ EnvMgLenSet(-1);
+
+ #ifdef MP_PERL_HV_GMAGICAL_AWARE
+- MP_TRACE_e(MP_FUNC, "[%s/0x%lx] tie %%ENV, $r\n\t (%s%s)",
++ MP_TRACE_e(MP_FUNC, "[%s/0x%lx] tie %%ENV, $r\t (%s%s)",
+ modperl_pid_tid(r->pool), modperl_interp_address(aTHX),
+ modperl_server_desc(r->server, r->pool), r->uri);
+ SvGMAGICAL_on((SV*)ENVHV);
+@@ -423,7 +423,7 @@
+ EnvMgObjSet(NULL);
+
+ #ifdef MP_PERL_HV_GMAGICAL_AWARE
+- MP_TRACE_e(MP_FUNC, "[%s/0x%lx] untie %%ENV; # from r\n\t (%s%s)",
++ MP_TRACE_e(MP_FUNC, "[%s/0x%lx] untie %%ENV; # from r\t (%s%s)",
+ modperl_pid_tid(r->pool), modperl_interp_address(aTHX),
+ modperl_server_desc(r->server, r->pool), r->uri);
+ SvGMAGICAL_off((SV*)ENVHV);
+Index: src/modules/perl/modperl_global.c
+===================================================================
+--- src/modules/perl/modperl_global.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_global.c (.../trunk) (revision 630610)
+@@ -77,7 +77,7 @@
+ {
+ modperl_global_t *global = (modperl_global_t *)data;
+
+- MP_TRACE_g(MP_FUNC, "destroy lock for %s\n", global->name);
++ MP_TRACE_g(MP_FUNC, "destroy lock for %s", global->name);
+ MUTEX_DESTROY(&global->glock);
+
+ return APR_SUCCESS;
+@@ -100,13 +100,13 @@
+ apr_pool_cleanup_null);
+ #endif
+
+- MP_TRACE_g(MP_FUNC, "init %s\n", name);
++ MP_TRACE_g(MP_FUNC, "init %s", name);
+ }
+
+ void modperl_global_lock(modperl_global_t *global)
+ {
+ #if MP_THREADED
+- MP_TRACE_g(MP_FUNC, "locking %s\n", global->name);
++ MP_TRACE_g(MP_FUNC, "locking %s", global->name);
+ MUTEX_LOCK(&global->glock);
+ #endif
+ }
+@@ -114,7 +114,7 @@
+ void modperl_global_unlock(modperl_global_t *global)
+ {
+ #if MP_THREADED
+- MP_TRACE_g(MP_FUNC, "unlocking %s\n", global->name);
++ MP_TRACE_g(MP_FUNC, "unlocking %s", global->name);
+ MUTEX_UNLOCK(&global->glock);
+ #endif
+ }
+@@ -185,11 +185,11 @@
+ {
+ int next;
+ /* XXX: inline lock/unlock? */
+- modperl_global_lock(&MP_global_anon_cnt);
++ modperl_global_lock(&MP_global_anon_cnt);
+
+ next = ++*(int *)(MP_global_anon_cnt.data);
+
+- modperl_global_unlock(&MP_global_anon_cnt);
++ modperl_global_unlock(&MP_global_anon_cnt);
+
+ return next;
+ }
+@@ -250,7 +250,7 @@
+
+ static apr_status_t modperl_tls_reset(void *data)
+ {
+- modperl_tls_cleanup_data_t *cdata =
++ modperl_tls_cleanup_data_t *cdata =
+ (modperl_tls_cleanup_data_t *)data;
+ return modperl_tls_set(cdata->key, cdata->data);
+ }
+Index: src/modules/perl/modperl_cgi.c
+===================================================================
+--- src/modules/perl/modperl_cgi.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_cgi.c (.../trunk) (revision 630610)
+@@ -75,7 +75,7 @@
+ r->method_number = M_GET;
+
+ /* We already read the message body (if any), so don't allow
+- * the redirected request to think it has one. We can ignore
++ * the redirected request to think it has one. We can ignore
+ * Transfer-Encoding, since we used REQUEST_CHUNKED_ERROR.
+ */
+ apr_table_unset(r->headers_in, "Content-Length");
+Index: src/modules/perl/modperl_cmd.c
+===================================================================
+--- src/modules/perl/modperl_cmd.c (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_cmd.c (.../trunk) (revision 630610)
+@@ -47,13 +47,13 @@
+
+ if (!*handlers) {
+ *handlers = modperl_handler_array_new(p);
+- MP_TRACE_d(MP_FUNC, "created handler stack\n");
++ MP_TRACE_d(MP_FUNC, "created handler stack");
+ }
+
+ /* XXX parse_handler if Perl is running */
+
+ modperl_handler_array_push(*handlers, h);
+- MP_TRACE_d(MP_FUNC, "pushed handler: %s\n", h->name);
++ MP_TRACE_d(MP_FUNC, "pushed handler: %s", h->name);
+
+ return NULL;
+ }
+@@ -84,11 +84,11 @@
+
+ if (!*handlers) {
+ *handlers = modperl_handler_array_new(p);
+- MP_TRACE_d(MP_FUNC, "created handler stack\n");
++ MP_TRACE_d(MP_FUNC, "created handler stack");
+ }
+
+ modperl_handler_array_push(*handlers, h);
+- MP_TRACE_d(MP_FUNC, "pushed httpd filter handler: %s\n", h->name);
++ MP_TRACE_d(MP_FUNC, "pushed httpd filter handler: %s", h->name);
+
+ return NULL;
+ }
+@@ -107,18 +107,18 @@
+
+ if (!*handlers) {
+ *handlers = modperl_handler_array_new(p);
+- MP_TRACE_d(MP_FUNC, "created handler stack\n");
++ MP_TRACE_d(MP_FUNC, "created handler stack");
+ }
+
+ modperl_handler_array_push(*handlers, h);
+- MP_TRACE_d(MP_FUNC, "pushed httpd filter handler: %s\n", h->name);
++ MP_TRACE_d(MP_FUNC, "pushed httpd filter handler: %s", h->name);
+
+ return NULL;
+ }
+
+
+ #define MP_CMD_SRV_TRACE \
+- MP_TRACE_d(MP_FUNC, "%s %s\n", parms->cmd->name, arg)
++ MP_TRACE_d(MP_FUNC, "%s %s", parms->cmd->name, arg)
+
+ #define MP_CMD_SRV_CHECK \
+ MP_CMD_SRV_TRACE; \
+@@ -156,7 +156,7 @@
+ if (modperl_vhost_is_running(s)) {
+ return modperl_cmd_too_late(parms);
+ }
+- MP_TRACE_d(MP_FUNC, "arg = %s\n", arg);
++ MP_TRACE_d(MP_FUNC, "arg = %s", arg);
+
+ if (!strncasecmp(arg, "+inherit", 8)) {
+ modperl_cmd_options(parms, mconfig, "+InheritSwitches");
+@@ -184,7 +184,7 @@
+ if (modperl_is_running()) {
+ char *error = NULL;
+
+- MP_TRACE_d(MP_FUNC, "load PerlModule %s\n", arg);
++ MP_TRACE_d(MP_FUNC, "load PerlModule %s", arg);
+
+ MP_PERL_CONTEXT_STORE_OVERRIDE(scfg->mip->parent->perl);
+ if (!modperl_require_module(aTHX_ arg, FALSE)) {
+@@ -199,7 +199,7 @@
+ return error;
+ }
+ else {
+- MP_TRACE_d(MP_FUNC, "push PerlModule %s\n", arg);
++ MP_TRACE_d(MP_FUNC, "push PerlModule %s", arg);
+ *(const char **)apr_array_push(scfg->PerlModule) = arg;
+ return NULL;
+ }
+@@ -222,7 +222,7 @@
+ if (modperl_is_running()) {
+ char *error = NULL;
+
+- MP_TRACE_d(MP_FUNC, "load PerlRequire %s\n", arg);
++ MP_TRACE_d(MP_FUNC, "load PerlRequire %s", arg);
+
+ MP_PERL_CONTEXT_STORE_OVERRIDE(scfg->mip->parent->perl);
+ if (!modperl_require_file(aTHX_ arg, FALSE)) {
+@@ -237,14 +237,14 @@
+ return error;
+ }
+ else {
+- MP_TRACE_d(MP_FUNC, "push PerlRequire %s\n", arg);
++ MP_TRACE_d(MP_FUNC, "push PerlRequire %s", arg);
+ *(const char **)apr_array_push(scfg->PerlRequire) = arg;
+ return NULL;
+ }
+ }
+
+ MP_CMD_SRV_DECLARE(config_requires)
+-{
++{
+ /* we must init earlier than normal */
+ modperl_run();
+
+@@ -261,7 +261,7 @@
+ MP_dSCFG(parms->server);
+
+ modperl_require_file_t *require = apr_pcalloc(p, sizeof(*require));
+- MP_TRACE_d(MP_FUNC, "push PerlPostConfigRequire for %s\n", arg);
++ MP_TRACE_d(MP_FUNC, "push PerlPostConfigRequire for %s", arg);
+ require->file = arg;
+ require->dcfg = dcfg;
+
+@@ -295,7 +295,7 @@
+ {
+ varfunc(dcfg->configvars, dcfg->setvars, arg1, arg2);
+
+- MP_TRACE_d(MP_FUNC, "%s DIR: arg1 = %s, arg2 = %s\n",
++ MP_TRACE_d(MP_FUNC, "%s DIR: arg1 = %s, arg2 = %s",
+ parms->cmd->name, arg1, arg2);
+
+ /* make available via Apache2->server->dir_config */
+@@ -303,7 +303,7 @@
+ MP_dSCFG(parms->server);
+ varfunc(scfg->configvars, scfg->setvars, arg1, arg2);
+
+- MP_TRACE_d(MP_FUNC, "%s SRV: arg1 = %s, arg2 = %s\n",
++ MP_TRACE_d(MP_FUNC, "%s SRV: arg1 = %s, arg2 = %s",
+ parms->cmd->name, arg1, arg2);
+ }
+
+@@ -335,7 +335,7 @@
+ modperl_str_toupper((char *)arg1);
+ #endif
+
+- MP_TRACE_d(MP_FUNC, "arg1 = %s, arg2 = %s\n", arg1, arg2);
++ MP_TRACE_d(MP_FUNC, "arg1 = %s, arg2 = %s", arg1, arg2);
+
+ if (!parms->path) {
+ /* will be propagated to environ */
+@@ -375,10 +375,10 @@
+ modperl_env_hv_store(aTHX_ arg, val);
+ MP_PERL_CONTEXT_RESTORE;
+ }
+- MP_TRACE_d(MP_FUNC, "arg = %s, val = %s\n", arg, val);
++ MP_TRACE_d(MP_FUNC, "arg = %s, val = %s", arg, val);
+ }
+ else {
+- MP_TRACE_d(MP_FUNC, "arg = %s: not found via getenv()\n", arg);
++ MP_TRACE_d(MP_FUNC, "arg = %s: not found via getenv()", arg);
+ }
+
+ return NULL;
+@@ -393,7 +393,7 @@
+ apr_pool_t *p = parms->temp_pool;
+ const char *error;
+
+- MP_TRACE_d(MP_FUNC, "arg = %s\n", arg);
++ MP_TRACE_d(MP_FUNC, "arg = %s", arg);
+ if ((error = modperl_options_set(p, opts, arg)) && !is_per_dir) {
+ /* maybe a per-directory option outside of a container */
+ if (modperl_options_set(p, dcfg->flags, arg) == NULL) {
+@@ -542,14 +542,14 @@
+
+ pkg_namespace = modperl_file2package(p, directive->filename);
+
+- pkg_name = apr_psprintf(p, "%s::%s::line_%d",
+- pkg_base,
+- pkg_namespace,
++ pkg_name = apr_psprintf(p, "%s::%s::line_%d",
++ pkg_base,
++ pkg_namespace,
+ directive->line_num);
+
+ apr_table_set(options, "package", pkg_name);
+
+- line_header = apr_psprintf(p, "\n#line %d %s\n",
++ line_header = apr_psprintf(p, "\n#line %d %s\n",
+ directive->line_num,
+ directive->filename);
+
+@@ -564,7 +564,7 @@
+ GV *gv = gv_fetchpv("0", TRUE, SVt_PV);
+ ENTER;SAVETMPS;
+ save_scalar(gv); /* local $0 */
+-#if PERL_REVISION == 5 && PERL_VERSION >= 9
++#if MP_PERL_VERSION_AT_LEAST(5, 9, 0)
+ TAINT_NOT; /* XXX: temp workaround, see my p5p post */
+ #endif
+ sv_setref_pv(server, "Apache2::ServerRec", (void*)s);
+@@ -619,7 +619,7 @@
+ {
+ char line[MAX_STRING_LEN];
+
+- if (arg && *arg && !(MP_POD_FORMAT(arg) || strstr("pod", arg))) {
++ if (arg && *arg && !(MP_POD_FORMAT(arg) || strstr("pod", arg))) {
+ return "Unknown =back format";
+ }
+
+@@ -660,7 +660,7 @@
+ {
+ const char *errmsg;
+
+- MP_TRACE_d(MP_FUNC, "PerlLoadModule %s\n", arg);
++ MP_TRACE_d(MP_FUNC, "PerlLoadModule %s", arg);
+
+ /* we must init earlier than normal */
+ modperl_run();
+@@ -822,7 +822,7 @@
+ MP_dSCFG(parms->server); \
+ int item = atoi(arg); \
+ scfg->interp_pool_cfg->xitem = item; \
+- MP_TRACE_d(MP_FUNC, "%s %d\n", parms->cmd->name, item); \
++ MP_TRACE_d(MP_FUNC, "%s %d", parms->cmd->name, item); \
+ return NULL; \
+ }
+
+Index: src/modules/perl/modperl_time.h
+===================================================================
+--- src/modules/perl/modperl_time.h (.../tags/2_0_3) (revision 630610)
++++ src/modules/perl/modperl_time.h (.../trunk) (revision 630610)
+@@ -44,7 +44,7 @@
+ double stime = \
+ (double)(end_time.tms_stime - start_time.tms_stime)/MP_HZ; \
+ if (utime || stime) { \
+- MP_TRACE_t(MP_FUNC, "%s %5.2f user %5.2f sys\n", \
++ MP_TRACE_t(MP_FUNC, "%s %5.2f user %5.2f sys", \
+ label, utime, stime); \
+ } \
+ })
+Index: xs/modperl_xs_util.h
+===================================================================
+--- xs/modperl_xs_util.h (.../tags/2_0_3) (revision 630610)
++++ xs/modperl_xs_util.h (.../trunk) (revision 630610)
+@@ -73,7 +73,7 @@
+
+ #define mpxs_sv_object_deref(sv, type) \
+ (mpxs_sv_is_object(sv) ? \
+- INT2PTR(type *, SvIVX((SV*)SvRV(sv))) : NULL)
++ INT2PTR(type *, SvIVX((SV*)SvRV(sv))) : NULL)
+
+ #define mpxs_sv2_obj(obj, sv) \
+ (obj = mp_xs_sv2_##obj(sv))
+Index: xs/maps/apache2_structures.map
+===================================================================
+--- xs/maps/apache2_structures.map (.../tags/2_0_3) (revision 630610)
++++ xs/maps/apache2_structures.map (.../trunk) (revision 630610)
+@@ -12,7 +12,7 @@
+ < next
+ < prev
+ < main
+-< the_request
++ the_request
+ assbackwards
+ ~ proxyreq
+ < header_only
+Index: xs/maps/apr_types.map
+===================================================================
+--- xs/maps/apr_types.map (.../tags/2_0_3) (revision 630610)
++++ xs/maps/apr_types.map (.../trunk) (revision 630610)
+@@ -102,7 +102,7 @@
+ struct apr_thread_mutex_t | APR::ThreadMutex
+ struct apr_thread_once_t | UNDEFINED
+ struct apr_thread_cond_t | UNDEFINED
+-struct apr_thread_rwlock_t | UNDEFINED
++struct apr_thread_rwlock_t | APR::ThreadRWLock
+
+ #signal stuff
+ apr_signum_t | UNDEFINED
+Index: xs/maps/apr_functions.map
+===================================================================
+--- xs/maps/apr_functions.map (.../tags/2_0_3) (revision 630610)
++++ xs/maps/apr_functions.map (.../trunk) (revision 630610)
+@@ -397,9 +397,9 @@
+ apr_thread_cond_pool_get
+ apr_thread_cond_timedwait
+
+--MODULE=APR::ThreadRWLock
+- apr_thread_rwlock_create
+- apr_thread_rwlock_destroy
++MODULE=APR::ThreadRWLock PREFIX=apr_thread_rwlock_
++ SV *:apr_thread_rwlock_create | mpxs_ | SV *:classname, SV *:p_sv | new
++ void:apr_thread_rwlock_destroy | | | apr_thread_rwlock_DESTROY
+ apr_thread_rwlock_rdlock
+ apr_thread_rwlock_tryrdlock
+ apr_thread_rwlock_trywrlock
+Index: xs/maps/apache2_functions.map
+===================================================================
+--- xs/maps/apache2_functions.map (.../tags/2_0_3) (revision 630610)
++++ xs/maps/apache2_functions.map (.../trunk) (revision 630610)
+@@ -176,6 +176,8 @@
+ !ap_get_local_host
+ ~ap_get_server_built
+ ~ap_get_server_version
++~ap_get_server_banner
++~ap_get_server_description
+ ~ap_server_root
+
+
+Index: xs/APR/APR/Makefile.PL
+===================================================================
+--- xs/APR/APR/Makefile.PL (.../tags/2_0_3) (revision 630610)
++++ xs/APR/APR/Makefile.PL (.../trunk) (revision 630610)
+@@ -15,7 +15,7 @@
+
+ my %args;
+
+-%args = map { split /=/, $_ } @ARGV;
++%args = map { split /=/, $_, 2 } @ARGV;
+
+ $args{NAME} = 'APR';
+ $args{VERSION_FROM} = 'APR.pm';
+Index: xs/APR/Base64/APR__Base64.h
+===================================================================
+--- xs/APR/Base64/APR__Base64.h (.../tags/2_0_3) (revision 630610)
++++ xs/APR/Base64/APR__Base64.h (.../trunk) (revision 630610)
+@@ -17,7 +17,7 @@
+ /* apr_base64_encode_len and apr_base64_encode_binary give length that
+ * includes the terminating '\0' */
+ #define mpxs_APR__Base64_encode_len(len) (apr_base64_encode_len(len) - 1)
+-
++
+ static MP_INLINE void mpxs_apr_base64_encode(pTHX_ SV *sv, SV *arg)
+ {
+ STRLEN len;
+Index: xs/APR/Table/APR__Table.h
+===================================================================
+--- xs/APR/Table/APR__Table.h (.../tags/2_0_3) (revision 630610)
++++ xs/APR/Table/APR__Table.h (.../trunk) (revision 630610)
+@@ -91,8 +91,8 @@
+ return rv;
+ }
+
+-static MP_INLINE
+-int mpxs_apr_table_do(pTHX_ I32 items, SV **MARK, SV **SP)
++static MP_INLINE
++int mpxs_apr_table_do(pTHX_ I32 items, SV **MARK, SV **SP)
+ {
+ apr_table_t *table;
+ SV *sub;
+@@ -119,8 +119,8 @@
+ }
+ }
+
+- /* XXX: would be nice to be able to call apr_table_vdo directly,
+- * but I don't think it's possible to create/populate something
++ /* XXX: would be nice to be able to call apr_table_vdo directly,
++ * but I don't think it's possible to create/populate something
+ * that smells like a va_list with our list of filters specs
+ */
+
+@@ -154,7 +154,7 @@
+ "first argument not an APR::Table object");
+ }
+
+- t = INT2PTR(apr_table_t *, SvIVX(SvRV(rv)));
++ t = INT2PTR(apr_table_t *, SvIVX(SvRV(rv)));
+
+ if (apr_is_empty_table(t)) {
+ return NULL;
+Index: xs/APR/Socket/APR__Socket.h
+===================================================================
+--- xs/APR/Socket/APR__Socket.h (.../tags/2_0_3) (revision 630610)
++++ xs/APR/Socket/APR__Socket.h (.../trunk) (revision 630610)
+@@ -59,7 +59,7 @@
+ apr_interval_time_t mpxs_apr_socket_timeout_get(pTHX_ I32 items,
+ SV **MARK, SV **SP)
+ {
+- apr_interval_time_t t;
++ apr_interval_time_t t;
+ APR__Socket APR__Socket;
+
+ /* this also magically assings to APR_Socket ;-) */
+Index: xs/APR/Lock/APR__Lock.h
+===================================================================
+--- xs/APR/Lock/APR__Lock.h (.../tags/2_0_3) (revision 630610)
++++ xs/APR/Lock/APR__Lock.h (.../trunk) (revision 630610)
+@@ -13,4 +13,3 @@
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-
+Index: xs/APR/BucketAlloc/APR__BucketAlloc.h
+===================================================================
+--- xs/APR/BucketAlloc/APR__BucketAlloc.h (.../tags/2_0_3) (revision 630610)
++++ xs/APR/BucketAlloc/APR__BucketAlloc.h (.../trunk) (revision 630610)
+@@ -27,4 +27,3 @@
+ mpxs_add_pool_magic(ba_sv, p_sv);
+ return ba_sv;
+ }
+-
+Index: xs/APR/Error/APR__Error.h
+===================================================================
+--- xs/APR/Error/APR__Error.h (.../tags/2_0_3) (revision 630610)
++++ xs/APR/Error/APR__Error.h (.../trunk) (revision 630610)
+@@ -15,4 +15,3 @@
+ */
+
+ #define mpxs_APR__Error_strerror(rc) modperl_error_strerror(aTHX_ rc)
+-
+Index: xs/APR/ThreadRWLock/APR__ThreadRWLock.h
+===================================================================
+--- xs/APR/ThreadRWLock/APR__ThreadRWLock.h (.../tags/2_0_3) (revision 0)
++++ xs/APR/ThreadRWLock/APR__ThreadRWLock.h (.../trunk) (revision 630610)
+@@ -0,0 +1,29 @@
++/* Licensed to the Apache Software Foundation (ASF) under one or more
++ * contributor license agreements. See the NOTICE file distributed with
++ * this work for additional information regarding copyright ownership.
++ * The ASF licenses this file to You under the Apache License, Version 2.0
++ * (the "License"); you may not use this file except in compliance with
++ * the License. You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define apr_thread_rwlock_DESTROY apr_thread_rwlock_destroy
++
++static MP_INLINE
++SV *mpxs_apr_thread_rwlock_create(pTHX_ SV *classname, SV *p_sv)
++{
++ apr_pool_t *p = mp_xs_sv2_APR__Pool(p_sv);
++ apr_thread_rwlock_t *rwlock = NULL;
++ SV *rwlock_sv;
++ (void)apr_thread_rwlock_create(&rwlock, p);
++ rwlock_sv = sv_setref_pv(NEWSV(0, 0), "APR::ThreadRWLock", (void*)rwlock);
++ mpxs_add_pool_magic(rwlock_sv, p_sv);
++ return rwlock_sv;
++}
+Index: xs/APR/PerlIO/modperl_apr_perlio.c
+===================================================================
+--- xs/APR/PerlIO/modperl_apr_perlio.c (.../tags/2_0_3) (revision 630610)
++++ xs/APR/PerlIO/modperl_apr_perlio.c (.../trunk) (revision 630610)
+@@ -86,7 +86,7 @@
+ switch (*mode) {
+ case 'a':
+ apr_flag = APR_APPEND | APR_CREATE;
+- break;
++ break;
+ case 'w':
+ apr_flag = APR_WRITE | APR_CREATE | APR_TRUNCATE;
+ break;
+@@ -176,7 +176,7 @@
+
+ rc = apr_file_read(st->file, vbuf, &count);
+
+- MP_TRACE_o(MP_FUNC, "%db [%s]\n", (int)count,
++ MP_TRACE_o(MP_FUNC, "%db [%s]", (int)count,
+ MP_TRACE_STR_TRUNC(st->pool, (char *)vbuf, (int)count));
+
+ if (rc == APR_EOF) {
+@@ -184,7 +184,7 @@
+ return count;
+ }
+ else if (rc != APR_SUCCESS) {
+- modperl_croak(aTHX_ rc, "APR::PerlIO::read");
++ modperl_croak(aTHX_ rc, "APR::PerlIO::read");
+ }
+
+ return count;
+@@ -195,7 +195,7 @@
+ PerlIOAPR *st = PerlIOSelf(f, PerlIOAPR);
+ apr_status_t rc;
+
+- MP_TRACE_o(MP_FUNC, "%db [%s]\n", (int)count,
++ MP_TRACE_o(MP_FUNC, "%db [%s]", (int)count,
+ MP_TRACE_STR_TRUNC(st->pool, (char *)vbuf, (int)count));
+
+ rc = apr_file_write(st->file, vbuf, &count);
+@@ -294,7 +294,7 @@
+ apr_file_name_get(&new_path, st->file);
+ }
+
+- rc = apr_os_file_get(&os_file, st->file);
++ rc = apr_os_file_get(&os_file, st->file);
+ if (rc != APR_SUCCESS) {
+ Perl_croak(aTHX_ "filedes retrieval failed!");
+ }
+@@ -408,7 +408,7 @@
+ PerlIOAPR_read,
+ PerlIOBase_unread,
+ PerlIOAPR_write,
+- PerlIOAPR_seek,
++ PerlIOAPR_seek,
+ PerlIOAPR_tell,
+ PerlIOAPR_close,
+ PerlIOAPR_flush, /* flush */
+@@ -475,7 +475,7 @@
+ apr_os_file_t os_file;
+
+ /* convert to the OS representation of file */
+- rc = apr_os_file_get(&os_file, file);
++ rc = apr_os_file_get(&os_file, file);
+ if (rc != APR_SUCCESS) {
+ croak("filedes retrieval failed!");
+ }
+@@ -495,10 +495,10 @@
+ static SV *modperl_apr_perlio_PerlIO_to_glob(pTHX_ PerlIO *pio,
+ modperl_apr_perlio_hook_e type)
+ {
+- SV *retval = modperl_perl_gensym(aTHX_ "APR::PerlIO");
+- GV *gv = (GV*)SvRV(retval);
++ SV *retval = modperl_perl_gensym(aTHX_ "APR::PerlIO");
++ GV *gv = (GV*)SvRV(retval);
+
+- gv_IOadd(gv);
++ gv_IOadd(gv);
+
+ switch (type) {
+ case MODPERL_APR_PERLIO_HOOK_WRITE:
+@@ -553,7 +553,7 @@
+ };
+
+ /* convert to the OS representation of file */
+- rc = apr_os_file_get(&os_file, file);
++ rc = apr_os_file_get(&os_file, file);
+ if (rc != APR_SUCCESS) {
+ Perl_croak(aTHX_ "filedes retrieval failed!");
+ }
+@@ -563,8 +563,8 @@
+ /* let's try without the dup, it seems to work fine:
+
+ fd = PerlLIO_dup(os_file);
+- MP_TRACE_o(MP_FUNC, "fd old: %d, new %d\n", os_file, fd);
+- if (!(retval = PerlIO_fdopen(fd, mode))) {
++ MP_TRACE_o(MP_FUNC, "fd old: %d, new %d", os_file, fd);
++ if (!(retval = PerlIO_fdopen(fd, mode))) {
+ ...
+ }
+
+@@ -576,22 +576,22 @@
+
+ */
+
+- if (!(retval = PerlIO_fdopen(os_file, mode))) {
++ if (!(retval = PerlIO_fdopen(os_file, mode))) {
+ PerlLIO_close(fd);
+ Perl_croak(aTHX_ "fdopen failed!");
+- }
++ }
+
+ return retval;
+ }
+
+-SV *modperl_apr_perlio_apr_file_to_glob(pTHX_ apr_file_t *file,
++SV *modperl_apr_perlio_apr_file_to_glob(pTHX_ apr_file_t *file,
+ apr_pool_t *pool,
+ modperl_apr_perlio_hook_e type)
+ {
+- SV *retval = modperl_perl_gensym(aTHX_ "APR::PerlIO");
+- GV *gv = (GV*)SvRV(retval);
++ SV *retval = modperl_perl_gensym(aTHX_ "APR::PerlIO");
++ GV *gv = (GV*)SvRV(retval);
+
+- gv_IOadd(gv);
++ gv_IOadd(gv);
+
+ switch (type) {
+ case MODPERL_APR_PERLIO_HOOK_WRITE:
+@@ -616,4 +616,3 @@
+ }
+
+ #endif /* PERLIO_LAYERS */
+-
+Index: xs/APR/PerlIO/modperl_apr_perlio.h
+===================================================================
+--- xs/APR/PerlIO/modperl_apr_perlio.h (.../tags/2_0_3) (revision 630610)
++++ xs/APR/PerlIO/modperl_apr_perlio.h (.../trunk) (revision 630610)
+@@ -19,7 +19,7 @@
+
+ #ifdef PERLIO_LAYERS
+ #include "perliol.h"
+-#else
++#else
+ #include "iperlsys.h"
+ #endif
+
+@@ -54,7 +54,7 @@
+ #ifndef MP_SOURCE_SCAN
+
+ #ifdef PERLIO_LAYERS
+-PerlIO *modperl_apr_perlio_apr_file_to_PerlIO(pTHX_ apr_file_t *file,
++PerlIO *modperl_apr_perlio_apr_file_to_PerlIO(pTHX_ apr_file_t *file,
+ apr_pool_t *pool,
+ modperl_apr_perlio_hook_e type);
+ APR_DECLARE_OPTIONAL_FN(PerlIO *,
+@@ -64,7 +64,7 @@
+ #endif /* PERLIO_LAYERS */
+
+
+-SV *modperl_apr_perlio_apr_file_to_glob(pTHX_ apr_file_t *file,
++SV *modperl_apr_perlio_apr_file_to_glob(pTHX_ apr_file_t *file,
+ apr_pool_t *pool,
+ modperl_apr_perlio_hook_e type);
+ APR_DECLARE_OPTIONAL_FN(SV *,
+Index: xs/APR/Brigade/APR__Brigade.h
+===================================================================
+--- xs/APR/Brigade/APR__Brigade.h (.../tags/2_0_3) (revision 630610)
++++ xs/APR/Brigade/APR__Brigade.h (.../trunk) (revision 630610)
+@@ -97,7 +97,7 @@
+ static MP_INLINE
+ apr_pool_t *mpxs_APR__Brigade_pool(apr_bucket_brigade *brigade)
+ {
+- /* eesh, it's r->pool, and c->pool, but bb->p
++ /* eesh, it's r->pool, and c->pool, but bb->p
+ * let's make Perl consistent, otherwise this could be autogenerated
+ */
+
+Index: xs/APR/URI/APR__URI.h
+===================================================================
+--- xs/APR/URI/APR__URI.h (.../tags/2_0_3) (revision 630610)
++++ xs/APR/URI/APR__URI.h (.../trunk) (revision 630610)
+@@ -47,7 +47,7 @@
+
+ uri_sv = sv_setref_pv(NEWSV(0, 0), "APR::URI", (void*)uri);
+ mpxs_add_pool_magic(uri_sv, p_sv);
+-
++
+ return uri_sv;
+ }
+
+Index: xs/APR/Finfo/APR__Finfo.h
+===================================================================
+--- xs/APR/Finfo/APR__Finfo.h (.../tags/2_0_3) (revision 630610)
++++ xs/APR/Finfo/APR__Finfo.h (.../trunk) (revision 630610)
+@@ -21,12 +21,12 @@
+ apr_pool_t *p = mp_xs_sv2_APR__Pool(p_sv);
+ apr_finfo_t *finfo = (apr_finfo_t *)apr_pcalloc(p, sizeof(apr_finfo_t));
+ SV *finfo_sv;
+-
++
+ MP_RUN_CROAK(apr_stat(finfo, fname, wanted, p),
+ "APR::Finfo::stat");
+
+ finfo_sv = sv_setref_pv(NEWSV(0, 0), "APR::Finfo", (void*)finfo);
+ mpxs_add_pool_magic(finfo_sv, p_sv);
+-
++
+ return finfo_sv;
+ }
+Index: xs/APR/String/APR__String.h
+===================================================================
+--- xs/APR/String/APR__String.h (.../tags/2_0_3) (revision 630610)
++++ xs/APR/String/APR__String.h (.../trunk) (revision 630610)
+@@ -21,5 +21,5 @@
+
+ apr_strfsize(size, buff);
+
+- return newSVpvn(buff, 4);
++ return newSVpvn(buff, 4);
+ }
+Index: xs/APR/Pool/APR__Pool.h
+===================================================================
+--- xs/APR/Pool/APR__Pool.h (.../tags/2_0_3) (revision 630610)
++++ xs/APR/Pool/APR__Pool.h (.../trunk) (revision 630610)
+@@ -39,10 +39,12 @@
+ */
+
+ #ifndef MP_SOURCE_SCAN
++#ifdef USE_ITHREADS
+ #include "apr_optional.h"
+-static
+ APR_OPTIONAL_FN_TYPE(modperl_interp_unselect) *modperl_opt_interp_unselect;
++APR_OPTIONAL_FN_TYPE(modperl_thx_interp_get) *modperl_opt_thx_interp_get;
+ #endif
++#endif
+
+ #define MP_APR_POOL_SV_HAS_OWNERSHIP(sv) mpxs_pool_is_custom(sv)
+
+@@ -64,7 +66,7 @@
+ mg_free(acct->sv); \
+ SvIVX(acct->sv) = 0; \
+ } STMT_END
+-
++
+ #ifdef USE_ITHREADS
+
+ #define MP_APR_POOL_SV_DROPS_OWNERSHIP(acct) STMT_START { \
+@@ -95,8 +97,10 @@
+ /* make sure interpreter is not putback into the mip \
+ * until this cleanup has run. \
+ */ \
+- if ((acct->interp = MP_THX_INTERP_GET(aTHX))) { \
+- acct->interp->refcnt++; \
++ if (modperl_opt_thx_interp_get) { \
++ if ((acct->interp = modperl_opt_thx_interp_get(aTHX))) { \
++ acct->interp->refcnt++; \
++ } \
+ } \
+ } STMT_END
+
+@@ -152,7 +156,7 @@
+ apr_pool_t *parent_pool = mpxs_sv_object_deref(parent_pool_obj, apr_pool_t);
+ apr_pool_t *child_pool = NULL;
+
+- MP_POOL_TRACE(MP_FUNC, "parent pool 0x%lx\n", (unsigned long)parent_pool);
++ MP_POOL_TRACE(MP_FUNC, "parent pool 0x%l", (unsigned long)parent_pool);
+ (void)apr_pool_create(&child_pool, parent_pool);
+
+ #if APR_POOL_DEBUG
+@@ -176,11 +180,11 @@
+ apr_pool_t *pp;
+
+ while ((pp = apr_pool_parent_get(p))) {
+- MP_POOL_TRACE(MP_FUNC, "parent 0x%lx, child 0x%lx\n",
++ MP_POOL_TRACE(MP_FUNC, "parent 0x%lx, child 0x%lx",
+ (unsigned long)pp, (unsigned long)p);
+
+ if (apr_pool_is_ancestor(pp, p)) {
+- MP_POOL_TRACE(MP_FUNC, "0x%lx is a subpool of 0x%lx\n",
++ MP_POOL_TRACE(MP_FUNC, "0x%lx is a subpool of 0x%lx",
+ (unsigned long)p, (unsigned long)pp);
+ }
+ p = pp;
+@@ -217,7 +221,7 @@
+ if (parent_pool) {
+ mpxs_add_pool_magic(rv, parent_pool_obj);
+ }
+-
++
+ return rv;
+ }
+ }
+@@ -335,8 +339,10 @@
+ /* make sure interpreter is not putback into the mip
+ * until this cleanup has run.
+ */
+- if ((data->interp = MP_THX_INTERP_GET(data->perl))) {
+- data->interp->refcnt++;
++ if (modperl_opt_thx_interp_get) {
++ if ((data->interp = modperl_opt_thx_interp_get(data->perl))) {
++ data->interp->refcnt++;
++ }
+ }
+ #endif
+
+@@ -374,4 +380,3 @@
+ apr_pool_destroy(p);
+ }
+ }
+-
+Index: xs/APR/Bucket/APR__Bucket.h
+===================================================================
+--- xs/APR/Bucket/APR__Bucket.h (.../tags/2_0_3) (revision 630610)
++++ xs/APR/Bucket/APR__Bucket.h (.../trunk) (revision 630610)
+@@ -119,6 +119,6 @@
+ * by modperl_bucket_sv_setaside) if the pool goes out of scope,
+ * copying the data to the heap.
+ */
+-
++
+ return rc;
+ }
+Index: xs/Apache2/RequestIO/Apache2__RequestIO.h
+===================================================================
+--- xs/Apache2/RequestIO/Apache2__RequestIO.h (.../tags/2_0_3) (revision 630610)
++++ xs/Apache2/RequestIO/Apache2__RequestIO.h (.../trunk) (revision 630610)
+@@ -97,7 +97,7 @@
+ mpxs_output_flush(r, rcfg, "Apache2::RequestIO::print");
+
+ return bytes ? newSVuv(bytes) : newSVpvn("0E0", 3);
+-}
++}
+
+ static MP_INLINE
+ apr_size_t mpxs_ap_rprintf(pTHX_ I32 items, SV **MARK, SV **SP)
+@@ -129,7 +129,7 @@
+ mpxs_output_flush(r, rcfg, "Apache2::RequestIO::printf");
+
+ return bytes;
+-}
++}
+
+ /* alias */
+ #define mpxs_Apache2__RequestRec_WRITE(r, buffer, len, offset) \
+@@ -252,7 +252,7 @@
+
+ if (total > 0) {
+ mpxs_sv_cur_set(buffer, offset+total);
+- }
++ }
+ else {
+ sv_setpvn(buffer, "", 0);
+ }
+Index: xs/Apache2/Log/Apache2__Log.h
+===================================================================
+--- xs/Apache2/Log/Apache2__Log.h (.../tags/2_0_3) (revision 630610)
++++ xs/Apache2/Log/Apache2__Log.h (.../trunk) (revision 630610)
+@@ -16,9 +16,9 @@
+
+ static void mpxs_Apache2__Log_BOOT(pTHX)
+ {
+- av_push(get_av("Apache2::Log::Request::ISA", TRUE),
++ av_push(get_av("Apache2::Log::Request::ISA", TRUE),
+ newSVpv("Apache2::Log", 12));
+- av_push(get_av("Apache2::Log::Server::ISA", TRUE),
++ av_push(get_av("Apache2::Log::Server::ISA", TRUE),
+ newSVpv("Apache2::Log", 12));
+ }
+
+@@ -54,7 +54,7 @@
+ line = CopLINE(cop); /* (caller)[2] */
+ }
+
+- if ((s->loglevel >= lmask) &&
++ if ((s->loglevel >= lmask) &&
+ SvROK(msg) && (SvTYPE(SvRV(msg)) == SVt_PVCV)) {
+ dSP;
+ ENTER;SAVETMPS;
+Index: xs/Apache2/RequestRec/Apache2__RequestRec.h
+===================================================================
+--- xs/Apache2/RequestRec/Apache2__RequestRec.h (.../tags/2_0_3) (revision 630610)
++++ xs/Apache2/RequestRec/Apache2__RequestRec.h (.../trunk) (revision 630610)
+@@ -35,10 +35,10 @@
+ SV *mpxs_Apache2__RequestRec_content_languages(pTHX_ request_rec *r,
+ SV *languages)
+ {
+- SV *retval = modperl_apr_array_header2avrv(aTHX_
++ SV *retval = modperl_apr_array_header2avrv(aTHX_
+ r->content_languages);
+ if (languages) {
+- r->content_languages = modperl_avrv2apr_array_header(aTHX_
++ r->content_languages = modperl_avrv2apr_array_header(aTHX_
+ r->pool,
+ languages);
+ }
+@@ -52,11 +52,11 @@
+
+ if (!val && !r->proxyreq &&
+ r->parsed_uri.scheme &&
+- !(r->parsed_uri.hostname &&
+- strEQ(r->parsed_uri.scheme, ap_http_scheme(r)) &&
+- ap_matches_request_vhost(r, r->parsed_uri.hostname,
+- r->parsed_uri.port_str ?
+- r->parsed_uri.port :
++ !(r->parsed_uri.hostname &&
++ strEQ(r->parsed_uri.scheme, ap_http_scheme(r)) &&
++ ap_matches_request_vhost(r, r->parsed_uri.hostname,
++ r->parsed_uri.port_str ?
++ r->parsed_uri.port :
+ ap_default_port(r))))
+ {
+ retval = r->proxyreq = 1;
+@@ -146,5 +146,3 @@
+
+ return RETVAL;
+ }
+-
+-
+Index: xs/Apache2/Module/Apache2__Module.h
+===================================================================
+--- xs/Apache2/Module/Apache2__Module.h (.../tags/2_0_3) (revision 630610)
++++ xs/Apache2/Module/Apache2__Module.h (.../trunk) (revision 630610)
+@@ -75,7 +75,7 @@
+ return mod->minor_version;
+ }
+
+-static MP_INLINE void mpxs_Apache2__Module_add(pTHX_
++static MP_INLINE void mpxs_Apache2__Module_add(pTHX_
+ char *package,
+ SV *cmds)
+ {
+@@ -90,7 +90,7 @@
+ error = modperl_module_add(s->process->pconf, s, package, cmds);
+
+ if (error) {
+- Perl_croak(aTHX_ "Apache2::Module::add(%s) failed : %s",
++ Perl_croak(aTHX_ "Apache2::Module::add(%s) failed : %s",
+ package, error);
+ }
+
+Index: xs/Apache2/Filter/Apache2__Filter.h
+===================================================================
+--- xs/Apache2/Filter/Apache2__Filter.h (.../tags/2_0_3) (revision 630610)
++++ xs/Apache2/Filter/Apache2__Filter.h (.../trunk) (revision 630610)
+@@ -32,8 +32,8 @@
+
+ mpxs_usage_va_1(modperl_filter, "$filter->print(...)");
+
+- MP_TRACE_f(MP_FUNC, "from %s\n",
+- ((modperl_filter_ctx_t *)modperl_filter->f->ctx)->handler->name);
++ MP_TRACE_f(MP_FUNC, "from %s",
++ ((modperl_filter_ctx_t *)modperl_filter->f->ctx)->handler->name);
+ if (modperl_filter->mode == MP_OUTPUT_FILTER_MODE) {
+ mpxs_write_loop(modperl_output_filter_write,
+ modperl_filter, "Apache2::Filter::print");
+@@ -57,7 +57,7 @@
+
+ mpxs_usage_va_2(modperl_filter, buffer, "$filter->read(buf, [len])");
+
+- MP_TRACE_f(MP_FUNC, "from %s\n",
++ MP_TRACE_f(MP_FUNC, "from %s",
+ ((modperl_filter_ctx_t *)modperl_filter->f->ctx)->handler->name);
+
+ if (items > 2) {
+@@ -86,14 +86,14 @@
+ return len;
+ }
+
+-static MP_INLINE U32 *modperl_filter_attributes(SV *package, SV *cvrv)
++static MP_INLINE U16 *modperl_filter_attributes(pTHX_ SV *package, SV *cvrv)
+ {
+- return (U32 *)&MP_CODE_ATTRS(SvRV(cvrv));
++ return modperl_code_attrs(aTHX_ (CV*)SvRV(cvrv));
+ }
+
+ #ifdef MP_TRACE
+ #define trace_attr() \
+- MP_TRACE_f(MP_FUNC, "applied %s attribute to %s handler\n", attribute, \
++ MP_TRACE_f(MP_FUNC, "applied %s attribute to %s handler", attribute, \
+ HvNAME(stash))
+ #else
+ #define trace_attr()
+@@ -118,7 +118,7 @@
+ MP_STATIC XS(MPXS_modperl_filter_attributes)
+ {
+ dXSARGS;
+- U32 *attrs = modperl_filter_attributes(ST(0), ST(1));
++ U16 *attrs = modperl_filter_attributes(aTHX_ ST(0), ST(1));
+ I32 i;
+ #ifdef MP_TRACE
+ HV *stash = gv_stashsv(ST(0), TRUE);
+@@ -295,7 +295,7 @@
+ if (!modperl_filter) {
+ f = INT2PTR(ap_filter_t *, SvIV(SvRV(*MARK)));
+ MP_TRACE_f(MP_FUNC,
+- " %s\n\n\t non-modperl filter removes itself\n",
++ " %s\n\n\t non-modperl filter removes itself",
+ f->frec->name);
+
+ /* the filter can reside in only one chain. hence we try to
+@@ -310,7 +310,7 @@
+
+ f = modperl_filter->f;
+
+- MP_TRACE_f(MP_FUNC, " %s\n\n\tfilter removes itself\n",
++ MP_TRACE_f(MP_FUNC, " %s\n\n\tfilter removes itself",
+ ((modperl_filter_ctx_t *)f->ctx)->handler->name);
+
+ if (modperl_filter->mode == MP_INPUT_FILTER_MODE) {
+Index: xs/Apache2/RequestUtil/Apache2__RequestUtil.h
+===================================================================
+--- xs/Apache2/RequestUtil/Apache2__RequestUtil.h (.../tags/2_0_3) (revision 630610)
++++ xs/Apache2/RequestUtil/Apache2__RequestUtil.h (.../trunk) (revision 630610)
+@@ -81,7 +81,7 @@
+ r->server = s;
+
+ r->request_time = apr_time_now();
+-
++
+ r->user = NULL;
+ r->ap_auth_type = NULL;
+
+@@ -125,7 +125,7 @@
+ if (base_pool_sv) {
+ mpxs_add_pool_magic(r_sv, base_pool_sv);
+ }
+-
++
+ return r_sv;
+ }
+
+@@ -320,7 +320,7 @@
+ struct mp_docroot_info *di;
+ core_server_config *conf;
+ MP_CROAK_IF_THREADS_STARTED("setting $r->document_root");
+- conf = ap_get_module_config(r->server->module_config,
++ conf = ap_get_module_config(r->server->module_config,
+ &core_module);
+ di = apr_palloc(r->pool, sizeof *di);
+ di->docroot = &conf->ap_document_root;
+@@ -340,7 +340,7 @@
+ /* On the first pass, re-register so we end up last */
+ if (data) {
+ apr_pool_cleanup_register(pool, NULL, child_terminate,
+- apr_pool_cleanup_null);
++ apr_pool_cleanup_null);
+ }
+ else {
+ exit(0);
+Index: xs/Apache2/SubProcess/Apache2__SubProcess.h
+===================================================================
+--- xs/Apache2/SubProcess/Apache2__SubProcess.h (.../tags/2_0_3) (revision 630610)
++++ xs/Apache2/SubProcess/Apache2__SubProcess.h (.../trunk) (revision 630610)
+@@ -68,7 +68,7 @@
+ if (FAILED(apr_procattr_create(&procattr, p)) ||
+ FAILED(apr_procattr_io_set(procattr, e_info.in_pipe,
+ e_info.out_pipe, e_info.err_pipe)) ||
+- FAILED(apr_procattr_dir_set(procattr,
++ FAILED(apr_procattr_dir_set(procattr,
+ ap_make_dirstr_parent(r->pool,
+ r->filename))) ||
+ FAILED(apr_procattr_cmdtype_set(procattr, e_info.cmd_type)))
+Index: xs/Apache2/MPM/Apache2__MPM.h
+===================================================================
+--- xs/Apache2/MPM/Apache2__MPM.h (.../tags/2_0_3) (revision 630610)
++++ xs/Apache2/MPM/Apache2__MPM.h (.../trunk) (revision 630610)
+@@ -38,7 +38,7 @@
+ apr_status_t retval = ap_mpm_query(AP_MPMQ_IS_THREADED, &mpm_query_info);
+
+ if (retval == APR_SUCCESS) {
+- MP_TRACE_g(MP_FUNC, "defined Apache2::MPM->is_threaded() as %i\n",
++ MP_TRACE_g(MP_FUNC, "defined Apache2::MPM->is_threaded() as %i",
+ mpm_query_info);
+
+ newCONSTSUB(PL_defstash, "Apache2::MPM::is_threaded",
+@@ -46,13 +46,13 @@
+ }
+ else {
+ /* assign false (0) to sub if ap_mpm_query didn't succeed */
+- MP_TRACE_g(MP_FUNC, "defined Apache2::MPM->is_threaded() as 0\n");
++ MP_TRACE_g(MP_FUNC, "defined Apache2::MPM->is_threaded() as 0");
+
+ newCONSTSUB(PL_defstash, "Apache2::MPM::is_threaded",
+ newSViv(0));
+ }
+
+- MP_TRACE_g(MP_FUNC, "defined Apache2::MPM->show() as %s\n",
++ MP_TRACE_g(MP_FUNC, "defined Apache2::MPM->show() as %s",
+ ap_show_mpm());
+
+ newCONSTSUB(PL_defstash, "Apache2::MPM::show",
+Index: xs/Apache2/ConnectionUtil/Apache2__ConnectionUtil.h
+===================================================================
+--- xs/Apache2/ConnectionUtil/Apache2__ConnectionUtil.h (.../tags/2_0_3) (revision 630610)
++++ xs/Apache2/ConnectionUtil/Apache2__ConnectionUtil.h (.../trunk) (revision 630610)
+@@ -20,7 +20,7 @@
+ MP_dCCFG;
+
+ modperl_config_con_init(c, ccfg);
+-
++
+ if (!ccfg) {
+ return &PL_sv_undef;
+ }
+Index: xs/Apache2/Connection/Apache2__Connection.h
+===================================================================
+--- xs/Apache2/Connection/Apache2__Connection.h (.../tags/2_0_3) (revision 630610)
++++ xs/Apache2/Connection/Apache2__Connection.h (.../trunk) (revision 630610)
+@@ -40,4 +40,3 @@
+ {
+ return ap_get_remote_host(c, (void *)dir_config, type, NULL);
+ }
+-
+Index: xs/Apache2/Access/Apache2__Access.h
+===================================================================
+--- xs/Apache2/Access/Apache2__Access.h (.../tags/2_0_3) (revision 630610)
++++ xs/Apache2/Access/Apache2__Access.h (.../trunk) (revision 630610)
+@@ -37,16 +37,16 @@
+
+ hv = newHV();
+
+- hv_store(hv, "method_mask", 11,
++ hv_store(hv, "method_mask", 11,
+ newSViv((IV)reqs[x].method_mask), 0);
+
+- hv_store(hv, "requirement", 11,
++ hv_store(hv, "requirement", 11,
+ newSVpv(reqs[x].requirement,0), 0);
+
+ av_push(av, newRV_noinc((SV*)hv));
+ }
+
+- return newRV_noinc((SV*)av);
++ return newRV_noinc((SV*)av);
+ }
+
+ static MP_INLINE
+@@ -81,7 +81,7 @@
+ errmsg =
+ modperl_config_insert_request(aTHX_ r,
+ newRV_noinc((SV*)config),
+- OR_AUTHCFG, NULL,
++ OR_AUTHCFG, NULL,
+ MP_HTTPD_OVERRIDE_OPTS_UNSET);
+
+ if (errmsg) {
+@@ -147,7 +147,7 @@
+ int mpxs_Apache2__RequestRec_allow_override_opts(pTHX_ request_rec *r)
+ {
+ #ifdef MP_HTTPD_HAS_OVERRIDE_OPTS
+- core_dir_config *cfg = ap_get_module_config(r->per_dir_config,
++ core_dir_config *cfg = ap_get_module_config(r->per_dir_config,
+ &core_module);
+ return cfg->override_opts;
+ #else
+Index: xs/Apache2/SubRequest/Apache2__SubRequest.h
+===================================================================
+--- xs/Apache2/SubRequest/Apache2__SubRequest.h (.../tags/2_0_3) (revision 630610)
++++ xs/Apache2/SubRequest/Apache2__SubRequest.h (.../trunk) (revision 630610)
+@@ -23,8 +23,10 @@
+
+ if (r->main) {
+ modperl_config_req_t *rcfg = modperl_config_req_get(r->main);
+- MP_RUN_CROAK(modperl_wbucket_flush(rcfg->wbucket, FALSE),
+- "Apache2::SubRequest::run");
++ if (rcfg->wbucket) {
++ MP_RUN_CROAK(modperl_wbucket_flush(rcfg->wbucket, FALSE),
++ "Apache2::SubRequest::run");
++ }
+ }
+
+ return ap_run_sub_req(r);
+Index: xs/Apache2/ServerUtil/Apache2__ServerUtil.h
+===================================================================
+--- xs/Apache2/ServerUtil/Apache2__ServerUtil.h (.../tags/2_0_3) (revision 630610)
++++ xs/Apache2/ServerUtil/Apache2__ServerUtil.h (.../trunk) (revision 630610)
+@@ -195,4 +195,10 @@
+
+ newCONSTSUB(PL_defstash, "Apache2::ServerUtil::get_server_version",
+ newSVpv(ap_get_server_version(), 0));
++
++ newCONSTSUB(PL_defstash, "Apache2::ServerUtil::get_server_banner",
++ newSVpv(ap_get_server_banner(), 0));
++
++ newCONSTSUB(PL_defstash, "Apache2::ServerUtil::get_server_description",
++ newSVpv(ap_get_server_description(), 0));
+ }
+Index: xs/Apache2/CmdParms/Apache2__CmdParms.h
+===================================================================
+--- xs/Apache2/CmdParms/Apache2__CmdParms.h (.../tags/2_0_3) (revision 630610)
++++ xs/Apache2/CmdParms/Apache2__CmdParms.h (.../trunk) (revision 630610)
+@@ -25,7 +25,7 @@
+ return newSVpv(data, 0);
+ }
+
+- return &PL_sv_undef;
++ return &PL_sv_undef;
+ }
+
+ static MP_INLINE
+Index: xs/Apache2/Directive/Apache2__Directive.h
+===================================================================
+--- xs/Apache2/Directive/Apache2__Directive.h (.../tags/2_0_3) (revision 630610)
++++ xs/Apache2/Directive/Apache2__Directive.h (.../trunk) (revision 630610)
+@@ -35,8 +35,8 @@
+
+
+ /* Adds an entry to a hash, vivifying hash/array for multiple entries */
+-static void hash_insert(pTHX_ HV *hash, const char *key,
+- int keylen, const char *args,
++static void hash_insert(pTHX_ HV *hash, const char *key,
++ int keylen, const char *args,
+ int argslen, SV *value)
+ {
+ HV *subhash;
+@@ -73,7 +73,7 @@
+ }
+
+ static MP_INLINE SV *mpxs_Apache2__Directive_as_hash(pTHX_
+- ap_directive_t *tree)
++ ap_directive_t *tree)
+ {
+ const char *directive;
+ int directive_len;
+@@ -103,12 +103,12 @@
+ }
+
+ subtree = mpxs_Apache2__Directive_as_hash(aTHX_ tree->first_child);
+- hash_insert(aTHX_ hash, directive, directive_len,
++ hash_insert(aTHX_ hash, directive, directive_len,
+ args, args_len, subtree);
+ }
+ else {
+- hash_insert(aTHX_ hash, directive, directive_len,
+- args, args_len, Nullsv);
++ hash_insert(aTHX_ hash, directive, directive_len,
++ args, args_len, Nullsv);
+ }
+
+ tree = tree->next;
+@@ -122,7 +122,7 @@
+ dXSARGS;
+
+ if (items < 2 || items > 3) {
+- Perl_croak(aTHX_
++ Perl_croak(aTHX_
+ "Usage: Apache2::Directive::lookup(self, key, [args])");
+ }
+
+@@ -137,20 +137,20 @@
+ char *key = (char *)SvPV_nolen(ST(1));
+ int scalar_context = (G_SCALAR == GIMME_V);
+
+- if (SvROK(ST(0)) && sv_derived_from(ST(0), "Apache2::Directive")) {
+- IV tmp = SvIV((SV*)SvRV(ST(0)));
+- tree = INT2PTR(Apache2__Directive,tmp);
+- }
+- else {
+- tree = ap_conftree;
++ if (SvROK(ST(0)) && sv_derived_from(ST(0), "Apache2::Directive")) {
++ IV tmp = SvIV((SV*)SvRV(ST(0)));
++ tree = INT2PTR(Apache2__Directive,tmp);
+ }
++ else {
++ tree = ap_conftree;
++ }
+
+- if (items < 3) {
+- value = NULL;
++ if (items < 3) {
++ value = NULL;
+ }
+- else {
+- value = (char *)SvPV_nolen(ST(2));
+- }
++ else {
++ value = (char *)SvPV_nolen(ST(2));
++ }
+
+ while (tree) {
+ directive = tree->directive;
+Index: xs/tables/current/ModPerl/FunctionTable.pm
+===================================================================
+--- xs/tables/current/ModPerl/FunctionTable.pm (.../tags/2_0_3) (revision 630610)
++++ xs/tables/current/ModPerl/FunctionTable.pm (.../trunk) (revision 630610)
+@@ -1239,6 +1239,20 @@
+ ]
+ },
+ {
++ 'return_type' => 'U16 *',
++ 'name' => 'modperl_code_attrs',
++ 'args' => [
++ {
++ 'type' => 'PerlInterpreter *',
++ 'name' => 'my_perl'
++ },
++ {
++ 'type' => 'CV *',
++ 'name' => 'cv'
++ }
++ ]
++ },
++ {
+ 'return_type' => 'int',
+ 'name' => 'modperl_config_apply_PerlModule',
+ 'args' => [
+@@ -5030,7 +5044,31 @@
+ 'args' => []
+ },
+ {
++ 'return_type' => 'modperl_interp_t *',
++ 'name' => 'modperl_thx_interp_get',
++ 'args' => [
++ {
++ 'type' => 'PerlInterpreter *',
++ 'name' => 'thx',
++ },
++ ],
++ },
++ {
+ 'return_type' => 'void',
++ 'name' => 'modperl_thx_interp_set',
++ 'args' => [
++ {
++ 'type' => 'PerlInterpreter *',
++ 'name' => 'thx',
++ },
++ {
++ 'type' => 'modperl_interp_t *',
++ 'name' => 'interp',
++ },
++ ],
++ },
++ {
++ 'return_type' => 'void',
+ 'name' => 'modperl_tipool_add',
+ 'args' => [
+ {
+Index: xs/tables/current/Apache2/FunctionTable.pm
+===================================================================
+--- xs/tables/current/Apache2/FunctionTable.pm (.../tags/2_0_3) (revision 630610)
++++ xs/tables/current/Apache2/FunctionTable.pm (.../trunk) (revision 630610)
+@@ -1476,6 +1476,16 @@
+ },
+ {
+ 'return_type' => 'const char *',
++ 'name' => 'ap_get_server_description',
++ 'args' => []
++ },
++ {
++ 'return_type' => 'const char *',
++ 'name' => 'ap_get_server_banner',
++ 'args' => []
++ },
++ {
++ 'return_type' => 'const char *',
+ 'name' => 'ap_get_status_line',
+ 'args' => [
+ {
+Index: BRANCHING
+===================================================================
+--- BRANCHING (.../tags/2_0_3) (revision 630610)
++++ BRANCHING (.../trunk) (revision 630610)
+@@ -1,53 +1,81 @@
+ This doc explains how to create/work/re-merge svn branches
+
+ #######################################
+-### make a new branch ###
++### PREREQUISITE ###
+ #######################################
+
+-we will create a branch clone-skip-unstable
++You need to have svnmerge installed and working
++before you can proceed with rest of the instructions.
+
+-tag before the branch:
++You can find it here:
+
+- svn copy https://svn.apache.org/repos/asf/perl/modperl/trunk \
+- https://svn.apache.org/repos/asf/perl/modperl/tags/pre-clone-skip \
+- -m "tag before branching for CLONE_SKIP support"
++http://www.orcaware.com/svn/wiki/Svnmerge.py
+
++#######################################
++### make a new branch ###
++#######################################
++
++we will create a branch mybranch
++
+ branch:
+
+ svn copy https://svn.apache.org/repos/asf/perl/modperl/trunk \
+- https://svn.apache.org/repos/asf/perl/modperl/branches/clone-skip-unstable \
+- -m "branching to provide CLONE_SKIP support"
++ https://svn.apache.org/repos/asf/perl/modperl/branches/mybranch \
++ -m "creating mybranch"
+
+ check out:
+
+- svn co https://svn.apache.org/repos/asf/perl/modperl/branches/clone-skip-unstable mp2-clone-skip-unstable
++ svn co https://svn.apache.org/repos/asf/perl/modperl/branches/mybranch
+
+ change externals to point to the new A-T branch (if one was done)
+
+ svn propedit svn:externals .
+
+-#######################################
+-### sync the branch with the trunk ###
+-#######################################
++initialize svnmerge tracking in the branch (if you plan to pull trunk/ changes into the branch)
+
+-the branch was created @r165203
++mybranch/ $> svnmerge init
++property 'svnmerge-integrated' set on '.'
++mybranch/ $> svn ci -F svnmerge-commit-message.txt
+
+- svn co https://svn.apache.org/repos/asf/perl/modperl/branches/clone-skip-unstable \
+- mp2-clone-skip-unstable
+- cd mp2-clone-skip-unstable
+- svn propset merge-point 165203 .
+- build/svn.remerge
+
+-now resolve any conflicts and commit the changes
++initialize svnmerge tracking on the trunk:
+
+-from now on, all you need to do is to run:
++trunk/ $> svnmerge init https://svn.apache.org/repos/asf/perl/modperl/branches/mybranch
++property 'svnmerge-integrated' set on '.'
++mybranch/ $> svn ci -F svnmerge-commit-message.txt
+
+- build/svn.remerge
+
+-as it automatically sets the merge-point during the last run
++##############################################
++### merging changes from branch to brahch ###
++##############################################
+
++Work from a clean checkout of the branch you want to merge *to*
+
+-#######################################
+-### merge the branch into the trunk ###
+-#######################################
++Check on the availability of changes to merge
+
++$> svnmerge avail -b -l
++
++------------------------------------------------------------------------
++r584362 | gozer | 2007-10-12 21:00:47 -0700 (Fri, 12 Oct 2007) | 1 line
++Changed paths:
++ A /perl/modperl/branches/mybranch (from /perl/modperl/trunk:584361)
++
++creating mybranch
++------------------------------------------------------------------------
++r584363 | gozer | 2007-10-12 21:05:32 -0700 (Fri, 12 Oct 2007) | 3 lines
++Changed paths:
++ M /perl/modperl/branches/mybranch
++
++Initialized merge tracking via "svnmerge" with revisions "1-584361" from
++https://svn.apache.org/repos/asf/perl/modperl/trunk
++
++Then merge the ones you want to merge
++
++$> svnmerge -r 584362-584363
++
++review the changes, fix conflicts, etc
++
++Check in the merged version
++
++$> svn ci -F svnmerge-commit-message.txt
++
+Index: build/svn.remerge
+===================================================================
+--- build/svn.remerge (.../tags/2_0_3) (revision 630610)
++++ build/svn.remerge (.../trunk) (revision 630610)
+@@ -1,28 +0,0 @@
+-#!/bin/bash
+-# automatic SVN merging
+-#
+-# when used for the first time, first run:
+-# svn propset merge-point $revision
+-# where $revision is the rev number when a branch was made
+-
+-root=`svn info . | perl -007 -ne 'm|URL: (.*?)/branches|s and print $1'`
+-trunk=${root}/trunk
+-
+-# svn 1.2.x supports "svn info URL". Without that, a stupid
+-# ls command is needed to find the current revision of the trunk
+-#next=`svn info $trunk | sed -n '/^Revision: /{s/.*: //g;p}'`
+-
+-next=`svn ls --verbose $root | perl -ne 'm|^\s+(\d+).*trunk/$| and print $1'`
+-last=`svn propget merge-point .`
+-
+-echo "$0: merging from trunk from r$last to r$next"
+-
+-echo + svn merge -r$last:$next $trunk .
+-svn merge -r$last:$next $trunk .
+-echo + svn propset merge-point $next
+-svn propset merge-point $next .
+-last=$((last + 1))
+-echo Merge r$last to r$next from trunk: > clog
+-echo >> clog
+-echo + svn log -r$last:$next $trunk
+-svn log -r$last:$next $trunk | sed '/^------/,/^$/d' >> clog
+Index: README-SVN
+===================================================================
+--- README-SVN (.../tags/2_0_3) (revision 630610)
++++ README-SVN (.../trunk) (revision 630610)
+@@ -28,7 +28,7 @@
+
+ DEVELOPER ACCESS
+
+-assuming you have already been granted commit access to the repository,
++assuming that you have already been granted commit access to the repository,
+ you should follow the following steps to checkout mod_perl
+
+ Change your password via:
+Index: t/apr-ext/threadrwlock.t
+===================================================================
+--- t/apr-ext/threadrwlock.t (.../tags/2_0_3) (revision 0)
++++ t/apr-ext/threadrwlock.t (.../trunk) (revision 630610)
+@@ -0,0 +1,11 @@
++#!perl -T
++
++use strict;
++use warnings FATAL => 'all';
++use Apache::Test;
++
++use TestAPRlib::threadrwlock;
++
++plan tests => TestAPRlib::threadrwlock::num_of_tests(), need_threads;
++
++TestAPRlib::threadrwlock::test();
+Index: t/apr-ext/perlio.t
+===================================================================
+--- t/apr-ext/perlio.t (.../tags/2_0_3) (revision 630610)
++++ t/apr-ext/perlio.t (.../trunk) (revision 630610)
+@@ -25,7 +25,7 @@
+ # prerequisite
+ # also need to check whether we build against the source tree, in
+ # which case we APR.so won't be linked against libapr/libaprutil
+-my $has_apr_config = $build->{apr_config_path} &&
++my $has_apr_config = $build->{apr_config_path} &&
+ !$build->httpd_is_source_tree;
+
+ my $has_perlio_layers = 0;
+@@ -230,11 +230,11 @@
+ }
+
+
+-# XXX: need tests
++# XXX: need tests
+ # - for stdin/out/err as they are handled specially
+
+ # XXX: tmpfile is missing:
+-# consider to use 5.8's syntax:
++# consider to use 5.8's syntax:
+ # open $fh, "+>", undef;
+
+ # cleanup: t_mkdir will remove the whole tree including the file
+Index: t/apr-ext/uuid.t
+===================================================================
+--- t/apr-ext/uuid.t (.../tags/2_0_3) (revision 630610)
++++ t/apr-ext/uuid.t (.../trunk) (revision 630610)
+@@ -16,7 +16,7 @@
+ #######
+ # my $build = Apache2::Build->build_config;
+ #
+-# my $has_apr_config = $build->{apr_config_path} &&
++# my $has_apr_config = $build->{apr_config_path} &&
+ # !$build->httpd_is_source_tree;
+ # plan tests => TestAPRlib::uuid::num_of_tests(),
+ # need {"the build couldn't find apr-config" => $has_apr_config};
+Index: t/apache/content_length_header.t
+===================================================================
+--- t/apache/content_length_header.t (.../tags/2_0_3) (revision 630610)
++++ t/apache/content_length_header.t (.../trunk) (revision 630610)
+@@ -72,13 +72,13 @@
+ ## to protect against wierd SVN checkout building.
+ ## XXX: I'm starting to think this test is more
+ ## trouble then its worth.
+- if (have_min_apache_version("2.2.1")) {
++ if (have_min_apache_version("2.2.1")) {
+ $head_cl = 25;
+ }
+ elsif (have_min_apache_version("2.2.0")) {
+ # $head_cl = undef; # avoid warnings
+ }
+- elsif (have_min_apache_version("2.0.56")) {
++ elsif (have_min_apache_version("2.0.56")) {
+ $head_cl = 25;
+ }
+ else {
+Index: t/apache/constants.t
+===================================================================
+--- t/apache/constants.t (.../tags/2_0_3) (revision 630610)
++++ t/apache/constants.t (.../trunk) (revision 630610)
+@@ -8,7 +8,7 @@
+ # -compile puts constants into the Apache2:: namespace
+ use Apache2::Const -compile => qw(:http :common :mpmq :proxy
+ TAKE23 &OPT_EXECCGI
+- DECLINE_CMD DIR_MAGIC_TYPE
++ DECLINE_CMD DIR_MAGIC_TYPE
+ CRLF);
+
+ # without -compile, constants are in the
+@@ -29,11 +29,11 @@
+
+ ok t_cmp(Apache2::Const::HTTP_GONE, 410, 'Apache2::Const::HTTP_GONE');
+
+-ok t_cmp(Apache2::Const::DIR_MAGIC_TYPE,
++ok t_cmp(Apache2::Const::DIR_MAGIC_TYPE,
+ 'httpd/unix-directory',
+ 'Apache2::Const::DIR_MAGIC_TYPE');
+
+-ok t_cmp(Apache2::Const::MPMQ_MAX_SPARE_DAEMONS,
++ok t_cmp(Apache2::Const::MPMQ_MAX_SPARE_DAEMONS,
+ 9,
+ 'Apache2::Const::MPMQ_MAX_SPARE_DAEMONS');
+
+Index: t/apr/pool_lifetime.t
+===================================================================
+--- t/apr/pool_lifetime.t (.../tags/2_0_3) (revision 630610)
++++ t/apr/pool_lifetime.t (.../trunk) (revision 630610)
+@@ -4,26 +4,20 @@
+ use Apache::Test;
+ use Apache::TestUtil;
+ use Apache::TestRequest;
+-use TestCommon::SameInterp;
++Apache::TestRequest::user_agent(keep_alive => 1);
+
+ plan tests => 2, need 'HTML::HeadParser';
+
+ my $module = 'TestAPR::pool_lifetime';
+ my $location = '/' . Apache::TestRequest::module2path($module);
+
+-t_debug "getting the same interp ID for $location";
+-my $same_interp = Apache::TestRequest::same_interp_tie($location);
+-
+-my $skip = $same_interp ? 0 : 1;
+-
+ for (1..2) {
+ my $expected = "Pong";
+- my $received = same_interp_req_body($same_interp, \&GET, $location);
+- $skip++ unless defined $received;
+- same_interp_skip_not_found(
+- $skip,
++ my $received = GET $location;
++
++ ok t_cmp(
++ $received->content,
+ $expected,
+- $received,
+- "Pong"
++ "Pong",
+ );
+ }
+
+Property changes on: t/apr
+___________________________________________________________________
+Name: svn:ignore
+ - base64.t
+brigade.t
+bucket.t
+constants.t
+date.t
+finfo.t
+flatten.t
+lib.t
+ipsubnet.t
+os.t
+perlio.t
+pool.t
+status.t
+sockaddr.t
+socket.t
+string.t
+table.t
+threadmutex.t
+uri.t
+util.t
+uuid.t
+
+ + base64.t
+brigade.t
+bucket.t
+constants.t
+date.t
+finfo.t
+flatten.t
+lib.t
+ipsubnet.t
+os.t
+perlio.t
+pool.t
+status.t
+sockaddr.t
+socket.t
+string.t
+table.t
+threadmutex.t
+threadrwlock.t
+uri.t
+util.t
+uuid.t
+
+
+Index: t/hooks/TestHooks/cleanup2.pm
+===================================================================
+--- t/hooks/TestHooks/cleanup2.pm (.../tags/2_0_3) (revision 630610)
++++ t/hooks/TestHooks/cleanup2.pm (.../trunk) (revision 630610)
+@@ -19,7 +19,7 @@
+ use Apache2::Const -compile => qw(OK DECLINED);
+ use APR::Const -compile => 'SUCCESS';
+
+-my $file = catfile Apache::Test::config->{vars}->{documentroot},
++my $file = catfile Apache::Test::config->{vars}->{documentroot},
+ "hooks", "cleanup2";
+
+ sub handler {
+Index: t/hooks/TestHooks/push_handlers_anon.pm
+===================================================================
+--- t/hooks/TestHooks/push_handlers_anon.pm (.../tags/2_0_3) (revision 630610)
++++ t/hooks/TestHooks/push_handlers_anon.pm (.../trunk) (revision 630610)
+@@ -46,9 +46,9 @@
+ <Perl >
+ my $s = Apache2::PerlSections->server;
+
+- $s->push_handlers(PerlFixupHandler =>
++ $s->push_handlers(PerlFixupHandler =>
+ sub { &TestHooks::push_handlers_anon::add_note });
+- $s->push_handlers(PerlFixupHandler =>
++ $s->push_handlers(PerlFixupHandler =>
+ \&TestHooks::push_handlers_anon::add_note );
+ $s->push_handlers(PerlFixupHandler =>
+ "TestHooks::push_handlers_anon::add_note" );
+Index: t/hooks/TestHooks/stacked_handlers2.pm
+===================================================================
+--- t/hooks/TestHooks/stacked_handlers2.pm (.../tags/2_0_3) (revision 630610)
++++ t/hooks/TestHooks/stacked_handlers2.pm (.../trunk) (revision 630610)
+@@ -1,6 +1,6 @@
+ package TestHooks::stacked_handlers2;
+
+-# this test exercises the execution of the stacked handlers
++# this test exercises the execution of the stacked handlers
+ # connection, translation, authen, authz, type, and response
+ # phases should end for the first handler that returns OK
+
+@@ -17,28 +17,28 @@
+
+ use Apache2::Const -compile => qw(OK DECLINED AUTH_REQUIRED SERVER_ERROR);
+
+-sub ok {
++sub ok {
+
+ callback(shift);
+
+ return Apache2::Const::OK;
+ }
+
+-sub declined {
++sub declined {
+
+ callback(shift);
+
+ return Apache2::Const::DECLINED;
+ }
+
+-sub auth_required {
++sub auth_required {
+
+ callback(shift);
+
+ return Apache2::Const::AUTH_REQUIRED;
+ }
+
+-sub server_error {
++sub server_error {
+
+ callback(shift);
+
+@@ -88,9 +88,9 @@
+ foreach my $callback (qw(PerlPostReadRequestHandler
+ PerlTransHandler
+ PerlMapToStorageHandler
+- PerlHeaderParserHandler
+- PerlAccessHandler
+- PerlAuthenHandler
++ PerlHeaderParserHandler
++ PerlAccessHandler
++ PerlAuthenHandler
+ PerlAuthzHandler
+ PerlTypeHandler
+ PerlFixupHandler
+@@ -165,14 +165,14 @@
+ PerlHeaderParserHandler TestHooks::stacked_handlers2::declined TestHooks::stacked_handlers2::ok
+
+ # all 2 run
+- PerlAccessHandler TestHooks::stacked_handlers2::ok TestHooks::stacked_handlers2::ok
++ PerlAccessHandler TestHooks::stacked_handlers2::ok TestHooks::stacked_handlers2::ok
+
+ # 2 run, 1 left behind
+- PerlAuthenHandler TestHooks::stacked_handlers2::declined TestHooks::stacked_handlers2::ok
++ PerlAuthenHandler TestHooks::stacked_handlers2::declined TestHooks::stacked_handlers2::ok
+ PerlAuthenHandler TestHooks::stacked_handlers2::auth_required
+
+ # 2 run, 1 left behind
+- PerlAuthzHandler TestHooks::stacked_handlers2::declined TestHooks::stacked_handlers2::ok
++ PerlAuthzHandler TestHooks::stacked_handlers2::declined TestHooks::stacked_handlers2::ok
+ PerlAuthzHandler TestHooks::stacked_handlers2::auth_required
+
+ # 1 run, 1 left behind
+@@ -183,7 +183,7 @@
+ PerlFixupHandler TestHooks::stacked_handlers2::push_handlers
+
+ # 2 run, 2 left behind
+- PerlResponseHandler TestHooks::stacked_handlers2::declined TestHooks::stacked_handlers2
++ PerlResponseHandler TestHooks::stacked_handlers2::declined TestHooks::stacked_handlers2
+ PerlResponseHandler TestHooks::stacked_handlers2::ok TestHooks::stacked_handlers2::server_error
+
+ SetHandler modperl
+Index: t/hooks/TestHooks/push_handlers_same_phase.pm
+===================================================================
+--- t/hooks/TestHooks/push_handlers_same_phase.pm (.../tags/2_0_3) (revision 630610)
++++ t/hooks/TestHooks/push_handlers_same_phase.pm (.../trunk) (revision 630610)
+@@ -1,6 +1,6 @@
+ package TestHooks::push_handlers_same_phase;
+
+-# test that we
++# test that we
+ # - can push handlers into the same phase that is currently running
+ # - cannot switch 'perl-script' to 'modperl' and vice versa once
+ # inside the response phase
+Index: t/hooks/TestHooks/authz.pm
+===================================================================
+--- t/hooks/TestHooks/authz.pm (.../tags/2_0_3) (revision 630610)
++++ t/hooks/TestHooks/authz.pm (.../trunk) (revision 630610)
+@@ -16,8 +16,8 @@
+ unless($r->user and $sent_pw) {
+ # testing $r->note_auth_failure:
+ # AuthType Basic + note_auth_failure == note_basic_auth_failure;
+- $r->note_auth_failure;
+- return Apache2::Const::HTTP_UNAUTHORIZED;
++ $r->note_auth_failure;
++ return Apache2::Const::HTTP_UNAUTHORIZED;
+ }
+
+ return Apache2::Const::OK;
+Index: t/hooks/TestHooks/push_handlers.pm
+===================================================================
+--- t/hooks/TestHooks/push_handlers.pm (.../tags/2_0_3) (revision 630610)
++++ t/hooks/TestHooks/push_handlers.pm (.../trunk) (revision 630610)
+@@ -17,7 +17,7 @@
+ $r->handler("modperl");
+
+ $r->push_handlers(PerlResponseHandler => \&coderef);
+- $r->push_handlers(PerlResponseHandler =>
++ $r->push_handlers(PerlResponseHandler =>
+ \&TestHooks::push_handlers::full_coderef);
+
+ $r->push_handlers(PerlResponseHandler =>
+Index: t/hooks/TestHooks/inlined_handlers.pm
+===================================================================
+--- t/hooks/TestHooks/inlined_handlers.pm (.../tags/2_0_3) (revision 630610)
++++ t/hooks/TestHooks/inlined_handlers.pm (.../trunk) (revision 630610)
+@@ -5,10 +5,6 @@
+ # previously there was a bug in non-ithreaded-perl implementation
+ # where the cached compiled CODE ref didn't have the reference count
+ # right.
+-#
+-# this test needs to run via the same_interpr framework, since it must
+-# test that the same perl interprter/process gets to run the same
+-# inlined handler
+
+ use strict;
+ use warnings FATAL => 'all';
+@@ -30,7 +26,6 @@
+ <NoAutoConfig>
+ <Location /TestHooks__inlined_handlers>
+ SetHandler modperl
+- PerlInitHandler Apache::TestHandler::same_interp_fixup
+ PerlFixupHandler 'sub { use Apache2::Const qw(DECLINED); DECLINED }'
+ PerlResponseHandler TestHooks::inlined_handlers
+ </Location>
+Index: t/hooks/push_handlers.t
+===================================================================
+--- t/hooks/push_handlers.t (.../tags/2_0_3) (revision 630610)
++++ t/hooks/push_handlers.t (.../trunk) (revision 630610)
+@@ -7,7 +7,7 @@
+
+ plan tests => 1;
+
+-my @refs = qw(conf conf1 conf2 coderef
++my @refs = qw(conf conf1 conf2 coderef
+ full_coderef coderef1 coderef2 coderef3);
+ my @anon = qw(anonymous anonymous1 coderef4 anonymous3);
+
+Index: t/hooks/inlined_handlers.t
+===================================================================
+--- t/hooks/inlined_handlers.t (.../tags/2_0_3) (revision 630610)
++++ t/hooks/inlined_handlers.t (.../trunk) (revision 630610)
+@@ -10,19 +10,14 @@
+
+ my $location = "/TestHooks__inlined_handlers";
+
+-t_debug "getting the same interp ID for $location";
+-my $same_interp = Apache::TestRequest::same_interp_tie($location);
+-
+-my $skip = $same_interp ? 0 : 1;
+ my $expected = "ok";
+ for (1..2) {
+- my $received = same_interp_req_body($same_interp, \&GET, $location);
+- $skip++ unless defined $received;
+- same_interp_skip_not_found(
+- $skip,
+- $received,
++ my $received = GET $location;
++
++ ok t_cmp(
++ $received->content,
+ $expected,
+- "anonymous handlers in httpd.conf test"
++ "anonymous handlers in httpd.conf test",
+ );
+ }
+
+Index: t/filter/out_str_req_mix.t
+===================================================================
+--- t/filter/out_str_req_mix.t (.../tags/2_0_3) (revision 630610)
++++ t/filter/out_str_req_mix.t (.../trunk) (revision 630610)
+@@ -15,5 +15,5 @@
+ my $received = POST_BODY $location, content => $content;
+ $received =~ s{\r?\n$}{};
+
+-ok t_cmp($expected, $received,
++ok t_cmp($expected, $received,
+ "mixing output httpd and mod_perl filters, while preserving order");
+Index: t/filter/TestFilter/out_str_subreq_default.pm
+===================================================================
+--- t/filter/TestFilter/out_str_subreq_default.pm (.../tags/2_0_3) (revision 630610)
++++ t/filter/TestFilter/out_str_subreq_default.pm (.../trunk) (revision 630610)
+@@ -15,7 +15,7 @@
+ use Apache2::Const -compile => qw(OK);
+
+ # include the contents of a subrequest
+-# in the filter, a la mod_include's
++# in the filter, a la mod_include's
+ # <!--#include virtual="/subrequest" -->
+
+ sub include {
+Index: t/filter/TestFilter/out_str_reverse.pm
+===================================================================
+--- t/filter/TestFilter/out_str_reverse.pm (.../tags/2_0_3) (revision 630610)
++++ t/filter/TestFilter/out_str_reverse.pm (.../trunk) (revision 630610)
+@@ -49,9 +49,9 @@
+ $r->content_type('text/plain');
+
+ # unbuffer stdout, so we get the data split across several bbs
+- local $_ = 1;
++ local $_ = 1;
+ if ($r->method_number == Apache2::Const::M_POST) {
+- my $data = TestCommon::Utils::read_post($r);
++ my $data = TestCommon::Utils::read_post($r);
+ $r->print($_) for grep length $_, split /(.{5})/, $data;
+ }
+
+Index: t/filter/TestFilter/with_subrequest.pm
+===================================================================
+--- t/filter/TestFilter/with_subrequest.pm (.../tags/2_0_3) (revision 0)
++++ t/filter/TestFilter/with_subrequest.pm (.../trunk) (revision 630610)
+@@ -0,0 +1,38 @@
++package TestFilter::with_subrequest;
++
++use strict;
++use warnings FATAL => 'all';
++
++use Apache2::Filter ();
++use Apache2::SubRequest ();
++
++use TestCommon::Utils;
++
++use Apache2::Const -compile => 'OK';
++
++sub handler {
++ my $f = shift;
++ my $r = $f->r;
++
++ my $subr;
++ while ($f->read(my $buffer, 1024)) {
++ $f->print(lc $buffer);
++ if (!$subr) {
++ $subr = $r->lookup_uri($r->uri);
++ my $rc = $subr->run;
++ }
++ }
++
++ Apache2::Const::OK;
++}
++
++1;
++__DATA__
++
++<Location /with_subrequest>
++ PerlOutputFilterHandler TestFilter::with_subrequest
++</Location>
++
++<IfModule mod_alias.c>
++ Alias /with_subrequest @top_dir@
++</IfModule>
+Index: t/filter/TestFilter/out_str_declined.pm
+===================================================================
+--- t/filter/TestFilter/out_str_declined.pm (.../tags/2_0_3) (revision 630610)
++++ t/filter/TestFilter/out_str_declined.pm (.../trunk) (revision 630610)
+@@ -34,7 +34,7 @@
+
+ # this filter ignores all the data that comes through, though on the
+ # last invocation it prints how many times the filter 'decline' was called
+-# which it could count by itself, but we want to test that
++# which it could count by itself, but we want to test that
+ # 'return Apache2::Const::DECLINED' works properly in output filters
+ sub black_hole {
+ my $filter = shift;
+Index: t/filter/TestFilter/in_bbs_inject_header.pm
+===================================================================
+--- t/filter/TestFilter/in_bbs_inject_header.pm (.../tags/2_0_3) (revision 630610)
++++ t/filter/TestFilter/in_bbs_inject_header.pm (.../trunk) (revision 630610)
+@@ -188,7 +188,7 @@
+ # normally the body will start coming in the next call to
+ # get_brigade, so if your filter only wants to work with
+ # the headers, it can decline all other invocations if that
+- # flag is set. However since in this test we need to send
++ # flag is set. However since in this test we need to send
+ # a few extra bucket brigades, we will turn another flag
+ # 'done_with_headers' when 'seen_body_separator' is on and
+ # all headers were sent out
+@@ -232,7 +232,7 @@
+
+ # propogate the input headers and the input back to the client
+ # as we need to do the validations on the client side
+- $r->headers_out->set($header1_key =>
++ $r->headers_out->set($header1_key =>
+ $r->headers_in->get($header1_key)||'');
+
+ for my $key (sort keys %headers) {
+Index: t/filter/TestFilter/out_str_subreq_modperl.pm
+===================================================================
+--- t/filter/TestFilter/out_str_subreq_modperl.pm (.../tags/2_0_3) (revision 630610)
++++ t/filter/TestFilter/out_str_subreq_modperl.pm (.../trunk) (revision 630610)
+@@ -15,7 +15,7 @@
+ use Apache2::Const -compile => qw(OK);
+
+ # include the contents of a subrequest
+-# in the filter, a la mod_include's
++# in the filter, a la mod_include's
+ # <!--#include virtual="/subrequest" -->
+
+ sub include {
+Index: t/filter/with_subrequest.t
+===================================================================
+--- t/filter/with_subrequest.t (.../tags/2_0_3) (revision 0)
++++ t/filter/with_subrequest.t (.../trunk) (revision 630610)
+@@ -0,0 +1,13 @@
++use strict;
++use warnings FATAL => 'all';
++
++use Apache::Test;
++use Apache::TestRequest;
++
++plan tests => 1, need 'mod_alias';
++
++my $location = "/with_subrequest/Makefile";
++
++my $str = GET_BODY $location;
++
++ok $str !~ /[A-Z]/;
+Index: t/conf/modperl_extra.pl
+===================================================================
+--- t/conf/modperl_extra.pl (.../tags/2_0_3) (revision 630610)
++++ t/conf/modperl_extra.pl (.../trunk) (revision 630610)
+@@ -19,7 +19,7 @@
+ use warnings FATAL => 'all';
+
+ die '$ENV{MOD_PERL} not set!' unless $ENV{MOD_PERL};
+-die '$ENV{MOD_PERL_API_VERSION} not set!'
++die '$ENV{MOD_PERL_API_VERSION} not set!'
+ unless $ENV{MOD_PERL_API_VERSION} == 2;
+
+ use File::Spec::Functions qw(canonpath catdir);
+Index: t/response/TestApache/conftree.pm
+===================================================================
+--- t/response/TestApache/conftree.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestApache/conftree.pm (.../trunk) (revision 630610)
+@@ -45,7 +45,7 @@
+ #XXX: This test isn't so good, but its quite problematic to try
+ #and _really_ compare $cfg and $tree...
+ {
+- my %vhosts = map {
++ my %vhosts = map {
+ $cfg->{vhosts}{$_}{name} => { %{$cfg->{vhosts}{$_}}, index => $_ }
+ } keys %{$cfg->{vhosts}};
+
+@@ -55,7 +55,7 @@
+
+ my $vhost_failed;
+ for my $vhost ($tree->lookup("VirtualHost")) {
+- unless (exists $vhosts{$vhost->{'ServerName'}
++ unless (exists $vhosts{$vhost->{'ServerName'}
+ || $vhost->{'PerlProcessConnectionHandler'}}) {
+ $vhost_failed++;
+ }
+@@ -87,7 +87,7 @@
+ $sub->($data, $node);
+ if (my $kid = $node->first_child) {
+ $node = $kid;
+- }
++ }
+ elsif (my $next = $node->next) {
+ $node = $next;
+ }
+Index: t/response/TestAPR/pool_lifetime.pm
+===================================================================
+--- t/response/TestAPR/pool_lifetime.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestAPR/pool_lifetime.pm (.../trunk) (revision 630610)
+@@ -23,5 +23,3 @@
+ }
+
+ 1;
+-__END__
+-PerlFixupHandler Apache::TestHandler::same_interp_fixup
+Index: t/response/TestAPR/threadrwlock.pm
+===================================================================
+--- t/response/TestAPR/threadrwlock.pm (.../tags/2_0_3) (revision 0)
++++ t/response/TestAPR/threadrwlock.pm (.../trunk) (revision 630610)
+@@ -0,0 +1,24 @@
++package TestAPR::threadrwlock;
++
++use strict;
++use warnings FATAL => 'all';
++
++use Apache::Test;
++use Apache::TestUtil;
++
++use Apache2::Const -compile => 'OK';
++
++use TestAPRlib::threadrwlock;
++
++sub handler {
++ my $r = shift;
++
++ my $tests = TestAPRlib::threadrwlock::num_of_tests();
++ plan $r, tests => $tests, need_threads;
++
++ TestAPRlib::threadrwlock::test();
++
++ Apache2::Const::OK;
++}
++
++1;
+Index: t/response/TestAPR/perlio.pm
+===================================================================
+--- t/response/TestAPR/perlio.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestAPR/perlio.pm (.../trunk) (revision 630610)
+@@ -22,7 +22,7 @@
+ # apr_file_dup has a bug on win32,
+ # should be fixed in apr 0.9.4 / httpd-2.0.48
+ require Apache2::Build;
+-use constant APR_WIN32_FILE_DUP_BUG =>
++use constant APR_WIN32_FILE_DUP_BUG =>
+ Apache2::Build::WIN32() && !have_min_apache_version('2.0.48');
+
+ sub handler {
+@@ -224,7 +224,7 @@
+ # tests reading and writing text and binary files
+ {
+ for my $file ('MoonRise.jpeg', 'redrum.txt') {
+- my $in = catfile $dir, $file;
++ my $in = catfile $dir, $file;
+ my $out = catfile $dir, "$file.out";
+ my ($apr_content, $perl_content);
+ open my $rfh, "<:APR", $in, $r->pool
+@@ -331,11 +331,11 @@
+ unlink $scratch;
+ }
+
+- # XXX: need tests
++ # XXX: need tests
+ # - for stdin/out/err as they are handled specially
+
+ # XXX: tmpfile is missing:
+- # consider to use 5.8's syntax:
++ # consider to use 5.8's syntax:
+ # open $fh, "+>", undef;
+
+ # cleanup: t_mkdir will remove the whole tree including the file
+Index: t/response/TestModperl/sameinterp.pm
+===================================================================
+--- t/response/TestModperl/sameinterp.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestModperl/sameinterp.pm (.../trunk) (revision 630610)
+@@ -1,26 +0,0 @@
+-package TestModperl::sameinterp;
+-
+-use warnings FATAL => 'all';
+-use strict;
+-
+-use Apache2::RequestIO ();
+-
+-use Apache::TestHandler ();
+-
+-use Apache2::Const -compile => qw(OK);
+-
+-my $value = '';
+-
+-sub handler {
+- my $r = shift;
+-
+- # test the actual global data
+- $value = Apache::TestHandler::same_interp_counter();
+- $r->puts($value);
+-
+- Apache2::Const::OK;
+-}
+-
+-1;
+-__END__
+-PerlFixupHandler Apache::TestHandler::same_interp_fixup
+Index: t/response/TestModperl/pnotes.pm
+===================================================================
+--- t/response/TestModperl/pnotes.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestModperl/pnotes.pm (.../trunk) (revision 630610)
+@@ -16,7 +16,7 @@
+
+ # make it ok to call ok() here while plan()ing elsewhere
+ Apache::Test::init_test_pm($r);
+-
++
+ Test::_reset_globals() if Test->can('_reset_globals');
+ $Test::ntest = 1 + (26 * ($r->args - 1));
+ $Test::planned = 26;
+@@ -102,7 +102,7 @@
+ else {
+ skip ('skipping $dbh retrival test - no DBI or DBD::DBM');
+ skip ('skipping $dbh->quote() test - no DBI or DBD::DBM');
+- }
++ }
+ }
+
+ # set pnotes so we can test unset on later connections
+Index: t/response/TestModperl/pnotes2.pm
+===================================================================
+--- t/response/TestModperl/pnotes2.pm (.../tags/2_0_3) (revision 0)
++++ t/response/TestModperl/pnotes2.pm (.../trunk) (revision 630610)
+@@ -0,0 +1,89 @@
++package TestModperl::pnotes2;
++
++use strict;
++use warnings FATAL => 'all';
++
++use Apache2::Log ();
++use Apache2::RequestUtil ();
++use Apache2::ConnectionUtil ();
++
++use Apache2::Const -compile => 'OK';
++
++{
++ package TestModerl::pnotes2::x;
++ use strict;
++ use warnings FATAL => 'all';
++
++ sub new {shift;bless [@_];}
++ sub DESTROY {my $f=shift @{$_[0]}; $f->(@{$_[0]});}
++}
++
++sub line {
++ our $cleanup;
++
++ Apache2::ServerRec::warn "pnotes are destroyed after cleanup ".$cleanup;
++}
++
++sub cleanup {
++ our $cleanup;
++ $cleanup='passed';
++
++ return Apache2::Const::OK;
++}
++
++sub handler {
++ my $r = shift;
++
++ our $cleanup;
++ $cleanup='';
++
++ $r->push_handlers( PerlCleanupHandler=>__PACKAGE__.'::cleanup' );
++
++ if(!defined $r->args) {
++ } elsif($r->args == 1) {
++ $r->pnotes(x1 => TestModerl::pnotes2::x->new(\&line));
++ } elsif($r->args == 2) {
++ $r->pnotes->{x1} = TestModerl::pnotes2::x->new(\&line);
++ } elsif($r->args == 3) {
++ $r->pnotes(x1 => TestModerl::pnotes2::x->new(\&line));
++ $r->pnotes(x2 => 2);
++ } elsif($r->args == 4) {
++ $r->pnotes->{x1} = TestModerl::pnotes2::x->new(\&line);
++ $r->pnotes->{x2} = 2;
++ } elsif($r->args == 5) {
++ $r->pnotes(x1 => TestModerl::pnotes2::x->new(\&line));
++ $r->pnotes->{x2} = 2;
++ } elsif($r->args == 6) {
++ $r->pnotes->{x1} = TestModerl::pnotes2::x->new(\&line);
++ $r->pnotes(x2 => 2);
++ } elsif($r->args == 7) {
++ $r->connection->pnotes(x1 => TestModerl::pnotes2::x->new(\&line));
++ } elsif($r->args == 8) {
++ $r->connection->pnotes->{x1} = TestModerl::pnotes2::x->new(\&line);
++ } elsif($r->args == 9) {
++ $r->connection->pnotes(x1 => TestModerl::pnotes2::x->new(\&line));
++ $r->connection->pnotes(x2 => 2);
++ } elsif($r->args == 10) {
++ $r->connection->pnotes->{x1} = TestModerl::pnotes2::x->new(\&line);
++ $r->connection->pnotes->{x2} = 2;
++ } elsif($r->args == 11) {
++ $r->connection->pnotes(x1 => TestModerl::pnotes2::x->new(\&line));
++ $r->connection->pnotes->{x2} = 2;
++ } elsif($r->args == 12) {
++ $r->connection->pnotes->{x1} = TestModerl::pnotes2::x->new(\&line);
++ $r->connection->pnotes(x2 => 2);
++ }
++
++ $r->content_type('text/plain');
++ $r->print("OK");
++
++ Apache2::Const::OK;
++}
++
++1;
++__END__
++
++# Local Variables: #
++# mode: cperl #
++# cperl-indent-level: 4 #
++# End: #
+Index: t/response/TestModperl/cookie2.pm
+===================================================================
+--- t/response/TestModperl/cookie2.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestModperl/cookie2.pm (.../trunk) (revision 630610)
+@@ -44,6 +44,5 @@
+ __DATA__
+ SetHandler modperl
+ PerlModule TestModperl::cookie2
+-PerlInitHandler Apache::TestHandler::same_interp_fixup
+ PerlAccessHandler TestModperl::cookie2::access
+ PerlResponseHandler TestModperl::cookie2
+Index: t/response/TestModperl/perl_options2.pm
+===================================================================
+--- t/response/TestModperl/perl_options2.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestModperl/perl_options2.pm (.../trunk) (revision 630610)
+@@ -52,7 +52,7 @@
+
+ ok t_cmp($s->is_perl_option_enabled('Response'), 1,
+ "Response is off under PerlOptions None");
+-
++
+ return Apache2::Const::OK;
+ }
+
+Index: t/response/TestModperl/printf.pm
+===================================================================
+--- t/response/TestModperl/printf.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestModperl/printf.pm (.../trunk) (revision 630610)
+@@ -31,7 +31,7 @@
+ # ok 4 (gets input from the fixup handler via notes)
+ {
+ my $note = $r->notes->get("fixup") || '';
+- my $ok = $note =~
++ my $ok = $note =~
+ /\$r->printf can't be called before the response phase/;
+ $r->print("not ") unless $ok;
+ $r->print("ok 4\n");
+Index: t/response/TestModperl/subenv.pm
+===================================================================
+--- t/response/TestModperl/subenv.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestModperl/subenv.pm (.../trunk) (revision 630610)
+@@ -32,7 +32,7 @@
+ ok ! $ENV{$key}; # %ENV not populated yet
+ }
+
+- # subprocess_env in void context with no arguments
++ # subprocess_env in void context with no arguments
+ # populates the same as +SetEnv
+ {
+ my $env = $r->subprocess_env;
+Index: t/response/TestModperl/dir_config.pm
+===================================================================
+--- t/response/TestModperl/dir_config.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestModperl/dir_config.pm (.../trunk) (revision 630610)
+@@ -16,7 +16,7 @@
+ sub handler {
+ my $r = shift;
+
+- plan $r, tests => 14;
++ plan $r, tests => 15;
+
+ #Apache2::RequestRec::dir_config tests
+
+@@ -28,6 +28,13 @@
+ my $dir_config = $r->dir_config;
+ ok defined $dir_config && ref($dir_config) eq 'APR::Table';
+
++ # make sure trying to get something that's not defined
++ # doesn't blow up
++ my $undef = $r->dir_config('EDOESNOTEXIST');
++
++ ok t_cmp($undef, undef,
++ 'no PerlSetVar to get data from');
++
+ # PerlAddVar ITERATE2 test
+ {
+ my $key = make_key('1');
+Index: t/response/TestModperl/setupenv.pm
+===================================================================
+--- t/response/TestModperl/setupenv.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestModperl/setupenv.pm (.../trunk) (revision 630610)
+@@ -321,7 +321,7 @@
+ PerlSetEnv DIR_PERLSETENV psvoid
+ </Location>
+
+- # equivalent to modperl handler with $r->subprocess_env() -
++ # equivalent to modperl handler with $r->subprocess_env() -
+ # CGI variables are there, but not subprocess_env entries
+ # that are populated after the void call
+ <Location /TestModperl__setupenv_psnosetupvoid>
+Index: t/response/TestModperl/cookie.pm
+===================================================================
+--- t/response/TestModperl/cookie.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestModperl/cookie.pm (.../trunk) (revision 630610)
+@@ -48,7 +48,6 @@
+ __DATA__
+ SetHandler perl-script
+ PerlModule TestModperl::cookie
+-PerlInitHandler Apache::TestHandler::same_interp_fixup
+ PerlAccessHandler TestModperl::cookie::access
+ PerlResponseHandler TestModperl::cookie
+ PerlOptions -SetupEnv
+Index: t/response/TestModperl/method.pm
+===================================================================
+--- t/response/TestModperl/method.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestModperl/method.pm (.../trunk) (revision 630610)
+@@ -40,7 +40,7 @@
+
+ ok t_cmp(
+ $r->uri,
+- '/' . Apache::TestRequest::module2path($class),
++ '/' . Apache::TestRequest::module2path($class),
+ '$r->uri eq $location');
+
+ if ($is_obj) {
+Index: t/response/TestModperl/request_rec_perlio_api.pm
+===================================================================
+--- t/response/TestModperl/request_rec_perlio_api.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestModperl/request_rec_perlio_api.pm (.../trunk) (revision 630610)
+@@ -93,7 +93,7 @@
+ # now close it completely and restore it, without using any dupped
+ # filehandle
+ close STDOUT;
+- open STDOUT, ">:Apache2", $r
++ open STDOUT, ">:Apache2", $r
+ or die "can't open STDOUT via :Apache2 layer : $!";
+ print "next you reincarnate...";
+
+Index: t/response/TestModperl/current_callback.pm
+===================================================================
+--- t/response/TestModperl/current_callback.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestModperl/current_callback.pm (.../trunk) (revision 630610)
+@@ -33,7 +33,7 @@
+ sub check {
+ my $expected = 'Perl' . shift() . 'Handler';
+ my $callback = ModPerl::Util::current_callback();
+- die "expecting $expected callback, instead got $callback"
++ die "expecting $expected callback, instead got $callback"
+ unless $callback eq $expected;
+ #warn "in callback: $callback\n";
+ return Apache2::Const::OK;
+Index: t/response/TestModperl/local_env.pm
+===================================================================
+--- t/response/TestModperl/local_env.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestModperl/local_env.pm (.../trunk) (revision 630610)
+@@ -22,16 +22,16 @@
+
+ my %copy_ENV = %ENV; ## this is not a deep copy;
+
+- ok t_cmp($ENV{MOD_PERL_API_VERSION}, 2,
++ ok t_cmp($ENV{MOD_PERL_API_VERSION}, 2,
+ "\$ENV{MOD_PERL_API_VERSION} is 2 before local \%ENV");
+
+ {
+ local %ENV;
+
+- ok t_cmp($ENV{MOD_PERL_API_VERSION}, undef,
++ ok t_cmp($ENV{MOD_PERL_API_VERSION}, undef,
+ "\$ENV{MOD_PERL_API_VERSION} is undef after local \%ENV");
+
+- ok t_cmp(scalar keys %ENV, 0,
++ ok t_cmp(scalar keys %ENV, 0,
+ "\%ENV has 0 keys after local");
+
+ $ENV{LOCAL} = 1;
+Index: t/response/TestPerl/hash_attack.pm
+===================================================================
+--- t/response/TestPerl/hash_attack.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestPerl/hash_attack.pm (.../trunk) (revision 630610)
+@@ -92,7 +92,7 @@
+ $stash->{$s}++;
+ debug sprintf "%2d: %5s, %10s, %s", $c, $s, $h, scalar(%$stash);
+ push @keys, $s;
+- debug "The hash collision attack has been successful"
++ debug "The hash collision attack has been successful"
+ if Internals::HvREHASH(%$stash);
+ } continue {
+ $s++;
+Index: t/response/TestPerl/ithreads_eval.pm
+===================================================================
+--- t/response/TestPerl/ithreads_eval.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestPerl/ithreads_eval.pm (.../trunk) (revision 630610)
+@@ -3,7 +3,7 @@
+ # reproducing a bug in perl ithreads: [perl #34341]
+ # https://rt.perl.org/rt3/Ticket/Display.html?id=34341
+ #
+-# $thr->join triggers the following leak:
++# $thr->join triggers the following leak:
+ # - due to to local $0, (its second MAGIC's MG_OBJ,
+ # you can see it in the output of Dump $0). This leak was first
+ # spotted in the RegistryCooker.pm which localizes $0
+Index: t/response/TestPerl/ithreads.pm
+===================================================================
+--- t/response/TestPerl/ithreads.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestPerl/ithreads.pm (.../trunk) (revision 630610)
+@@ -62,9 +62,9 @@
+
+ $counter_priv += $counter_priv for 1..10;
+ {
+- lock $counter_shar;
+- $counter_shar += $counter_shar for 1..10;
+- }
++ lock $counter_shar;
++ $counter_shar += $counter_shar for 1..10;
++ }
+
+ $thr->join;
+ ok t_cmp($counter_shar, 2**20, "shared counter");
+Index: t/response/TestCompat/apache.pm
+===================================================================
+--- t/response/TestCompat/apache.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestCompat/apache.pm (.../trunk) (revision 630610)
+@@ -128,6 +128,5 @@
+ __END__
+ # so we can test whether send_httpd_header() works fine
+ PerlOptions +ParseHeaders +GlobalRequest
+-AllowOverride Options
+ PerlModule TestCompat::apache
+ PerlFixupHandler TestCompat::apache::fixup
+Index: t/response/TestModules/reload.pm
+===================================================================
+--- t/response/TestModules/reload.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestModules/reload.pm (.../trunk) (revision 630610)
+@@ -1,50 +0,0 @@
+-package TestModules::reload;
+-
+-use strict;
+-use warnings FATAL => 'all';
+-
+-use ModPerl::Util ();
+-
+-use Apache2::Const -compile => qw(OK);
+-
+-my $package = 'Apache2::Reload::Test';
+-
+-our $pass = 0;
+-
+-sub handler {
+- my $r = shift;
+- $pass++;
+- if ($r->args eq 'last') {
+- Apache2::Reload->unregister_module($package);
+- ModPerl::Util::unload_package($package);
+- $pass = 0;
+- $r->print("unregistered OK");
+- return Apache2::Const::OK;
+- }
+-
+- eval "use $package";
+-
+- Apache2::Reload::Test::run($r);
+-
+- return Apache2::Const::OK;
+-}
+-
+-#This one shouldn't be touched
+-package Apache2::Reload::Test::SubPackage;
+-
+-sub subpackage {
+- if ($TestModules::reload::pass == '2') {
+- return 'subpackage';
+- }
+- else {
+- return 'SUBPACKAGE';
+- }
+-}
+-
+-1;
+-__END__
+-
+-PerlModule Apache2::Reload
+-PerlInitHandler Apache::TestHandler::same_interp_fixup Apache2::Reload
+-PerlSetVar ReloadDebug Off
+-PerlSetVar ReloadAll Off
+Index: t/response/TestAPI/request_rec.pm
+===================================================================
+--- t/response/TestAPI/request_rec.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestAPI/request_rec.pm (.../trunk) (revision 630610)
+@@ -24,7 +24,7 @@
+ sub handler {
+ my $r = shift;
+
+- plan $r, tests => 54;
++ plan $r, tests => 55;
+
+ #Apache2::RequestUtil->request($r); #PerlOptions +GlobalRequest takes care
+ my $gr = Apache2::RequestUtil->request;
+@@ -127,6 +127,13 @@
+ ok t_cmp $r->the_request, "GET $base_uri$path_info?$args HTTP/1.0",
+ '$r->the_request';
+
++ {
++ my $new_request = "GET $base_uri$path_info?$args&foo=bar HTTP/1.0";
++ my $old_request = $r->the_request($new_request);
++ ok t_cmp $r->the_request, $new_request, '$r->the_request rw';
++ $r->the_request($old_request);
++ }
++
+ ok $r->filename;
+
+ my $location = '/' . Apache::TestRequest::module2path(__PACKAGE__);
+Index: t/response/TestAPI/status.pm
+===================================================================
+--- t/response/TestAPI/status.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestAPI/status.pm (.../trunk) (revision 630610)
+@@ -22,7 +22,7 @@
+ if ($string) {
+ # status_line must be valid and match status
+ # or it is 'zapped' by httpd as of 2.2.1
+- $r->status($code);
++ $r->status($code);
+ $r->status_line("$code $string");
+ }
+ else {
+Index: t/response/TestAPI/access2.pm
+===================================================================
+--- t/response/TestAPI/access2.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestAPI/access2.pm (.../trunk) (revision 630610)
+@@ -55,7 +55,7 @@
+ return $rc if $rc != Apache2::Const::OK;
+
+ # extract just the requirement entries
+- my %require =
++ my %require =
+ map { my ($k, $v) = split /\s+/, $_->{requirement}, 2; ($k, $v||'') }
+ @{ $r->requires };
+ debug \%require;
+Index: t/response/TestAPI/uri.pm
+===================================================================
+--- t/response/TestAPI/uri.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestAPI/uri.pm (.../trunk) (revision 630610)
+@@ -104,7 +104,7 @@
+ }
+ {
+ # this time include args and a pool object
+- my $curl = $r->construct_url(sprintf "%s?%s", $r->uri, $r->args,
++ my $curl = $r->construct_url(sprintf "%s?%s", $r->uri, $r->args,
+ $r->pool->new);
+ t_debug("construct_url: $curl");
+ t_debug("r->uri: ", $r->uri);
+@@ -167,7 +167,7 @@
+ ok t_cmp($puri->port, $port, "port");
+
+ ok t_cmp($puri->unparse,
+- "ftp://perl.apache.org:$port$path?$query#$fragment",
++ "ftp://perl.apache.org:$port$path?$query#$fragment",
+ "unparse");
+ }
+
+Index: t/response/TestAPI/server_util.pm
+===================================================================
+--- t/response/TestAPI/server_util.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestAPI/server_util.pm (.../trunk) (revision 630610)
+@@ -110,7 +110,7 @@
+
+ # no file argument gives ServerRoot
+ {
+- my $server_root_relative =
++ my $server_root_relative =
+ Apache2::ServerUtil::server_root_relative($r->pool);
+
+ ok t_filepath_cmp(canonpath($server_root_relative),
+Index: t/response/TestAPI/server_const.pm
+===================================================================
+--- t/response/TestAPI/server_const.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestAPI/server_const.pm (.../trunk) (revision 630610)
+@@ -24,7 +24,7 @@
+
+ my $r = shift;
+
+- plan $r, tests => 3;
++ plan $r, tests => 5;
+
+ # test Apache2::ServerUtil constant subroutines
+
+@@ -36,10 +36,20 @@
+ $built,
+ 'Apache2::ServerUtil::get_server_built()');
+
+- ok t_cmp(Apache2::ServerUtil::get_server_version,
++ ok t_cmp(Apache2::ServerUtil::get_server_description,
+ $version,
++ 'Apache2::ServerUtil::get_server_description()');
++
++ my $server_version = Apache2::ServerUtil::get_server_version;
++ ok t_cmp($version,
++ qr/^$server_version/,
+ 'Apache2::ServerUtil::get_server_version()');
+
++ my $server_banner = Apache2::ServerUtil::get_server_banner;
++ ok t_cmp($version,
++ qr/^$server_banner/,
++ 'Apache2::ServerUtil::get_server_banner()');
++
+ Apache2::Const::OK;
+ }
+
+Index: t/response/TestAPI/add_config.pm
+===================================================================
+--- t/response/TestAPI/add_config.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestAPI/add_config.pm (.../trunk) (revision 630610)
+@@ -58,6 +58,14 @@
+ };
+ $r->pnotes(followsymlinks => "$@");
+
++ eval {
++ my $path="/a/path/to/somewhere";
++ $r->add_config(['PerlResponseHandler '.__PACKAGE__], -1, $path);
++ # now overwrite the path in place to see if the location pointer
++ # is really copied: see modperl_config_dir_create
++ $path=~tr[a-z][n-za-m];
++ };
++
+ return Apache2::Const::DECLINED;
+ }
+
+@@ -82,7 +90,7 @@
+ my ($self, $r) = @_;
+ my $cf = $self->get_config($r->server);
+
+- plan $r, tests => 8;
++ plan $r, tests => 9;
+
+ ok t_cmp $r->pnotes('add_config1'), qr/.+\n/;
+ ok t_cmp $r->pnotes('add_config2'), (APACHE22 ? qr/.+\n/ : '');
+@@ -102,6 +110,8 @@
+ my $opts = APACHE22 ? Apache2::Const::OPT_SYM_LINKS : $expect;
+ ok t_cmp $r->allow_override_opts, $opts;
+
++ ok t_cmp $r->location, '/a/path/to/somewhere';
++
+ return Apache2::Const::OK;
+ }
+
+@@ -117,7 +127,6 @@
+ <Directory @DocumentRoot@>
+ AllowOverride All
+ </Directory>
+- PerlResponseHandler TestAPI::add_config
+ PerlMapToStorageHandler TestAPI::add_config::map2storage
+ PerlFixupHandler TestAPI::add_config::fixup
+ </VirtualHost>
+Index: t/response/TestAPI/request_util.pm
+===================================================================
+--- t/response/TestAPI/request_util.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestAPI/request_util.pm (.../trunk) (revision 630610)
+@@ -40,7 +40,7 @@
+ }
+ else {
+ eval { $r->document_root('/tmp/foo') };
+- ok t_cmp($@, qr/Can't run.*in the threaded env/,
++ ok t_cmp($@, qr/Can't run.*in the threaded env/,
+ "document_root is read-only under threads");
+ ok 1;
+ }
+Index: t/response/TestError/api.pm
+===================================================================
+--- t/response/TestError/api.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestError/api.pm (.../trunk) (revision 630610)
+@@ -21,7 +21,7 @@
+
+ # PerlOptions -GlobalRequest is in effect
+ eval { my $gr = Apache2::RequestUtil->request; };
+- ok t_cmp($@,
++ ok t_cmp($@,
+ qr/\$r object is not available/,
+ "unavailable global $r object");
+
+Index: t/response/TestDirective/perldo.pm
+===================================================================
+--- t/response/TestDirective/perldo.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestDirective/perldo.pm (.../trunk) (revision 630610)
+@@ -12,7 +12,7 @@
+ sub handler {
+ my $r = shift;
+
+- plan $r, tests => 22, need_module('mod_alias');
++ plan $r, tests => 22, need_module('mod_alias');
+
+ ok t_cmp('yes', $TestDirective::perl::worked);
+
+@@ -53,22 +53,22 @@
+ ok t_cmp($@, "", "PerlSections dump syntax check");
+
+ ok t_cmp($TestDirective::perldo::test::Include, qr/perlsection.conf/);
+-
++
+ #Check for correct Apache2::ServerUtil->server behavior
+ my $bport = $TestDirective::perl::base_server->port;
+ my $vport = $TestDirective::perl::vhost_server->port;
+ ok defined $bport && defined $vport && $vport != $bport;
+-
++
+ foreach my $url (qw(scalar scalar1 scalar2)) {
+ my $res = GET "/perl_sections_perlconfig_$url/";
+ ok t_cmp($res->is_success, 1, '$PerlConfig');
+ }
+-
++
+ foreach my $url (qw(array1 array2)) {
+ my $res = GET "/perl_sections_perlconfig_$url/";
+ ok t_cmp($res->is_success, 1, '@PerlConfig');
+ }
+-
++
+ Apache2::Const::OK;
+ }
+
+Index: t/response/TestDirective/cmdparms.pm
+===================================================================
+--- t/response/TestDirective/cmdparms.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestDirective/cmdparms.pm (.../trunk) (revision 630610)
+@@ -47,7 +47,7 @@
+ foreach my $method (@methods) {
+ $srv_cfg->{$args}{$method} = $parms->$method();
+ }
+- $srv_cfg->{$args}{check_ctx} =
++ $srv_cfg->{$args}{check_ctx} =
+ $parms->check_cmd_context(Apache2::Const::NOT_IN_LOCATION);
+
+ $srv_cfg->{$args}{limited} = $parms->method_is_limited('GET');
+Index: t/response/TestDirective/env.pm
+===================================================================
+--- t/response/TestDirective/env.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestDirective/env.pm (.../trunk) (revision 630610)
+@@ -18,7 +18,7 @@
+
+ # %ENV
+ ok t_cmp(env_get('srv1'),
+- 'env_dir1',
++ 'env_dir1',
+ '%ENV per-dir override per-srv');
+
+ ok t_cmp(env_get('srv2'),
+Index: t/response/TestDirective/perlloadmodule.pm
+===================================================================
+--- t/response/TestDirective/perlloadmodule.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestDirective/perlloadmodule.pm (.../trunk) (revision 630610)
+@@ -38,7 +38,7 @@
+ my ($class, $parms) = @_;
+
+ bless {
+- path => $parms->path || "/",
++ path => $parms->path || "/",
+ }, $class;
+ }
+
+@@ -48,7 +48,7 @@
+ my %new = ();
+
+ @new{keys %$base, keys %$add} =
+- (values %$base, values %$add);
++ (values %$base, values %$add);
+
+ return bless \%new, ref($base);
+ }
+@@ -69,7 +69,7 @@
+ my ($class, $parms) = @_;
+ debug "$class->SERVER_CREATE\n";
+ return bless {
+- name => __PACKAGE__,
++ name => __PACKAGE__,
+ }, $class;
+ }
+
+Index: t/response/TestDirective/perlloadmodule3.pm
+===================================================================
+--- t/response/TestDirective/perlloadmodule3.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestDirective/perlloadmodule3.pm (.../trunk) (revision 630610)
+@@ -112,7 +112,7 @@
+ $secs{"2: Location"} = $dir_cfg;
+ }
+
+- $r->printf("Processing by %s.\n",
++ $r->printf("Processing by %s.\n",
+ $s->is_virtual ? "virtual host" : "main server");
+
+ for my $sec (sort keys %secs) {
+Index: t/response/TestDirective/perlrequire.pm
+===================================================================
+--- t/response/TestDirective/perlrequire.pm (.../tags/2_0_3) (revision 630610)
++++ t/response/TestDirective/perlrequire.pm (.../trunk) (revision 630610)
+@@ -26,7 +26,7 @@
+ Apache2::Const::OK;
+ }
+
+-my %require_tests =
++my %require_tests =
+ (
+ main => 'PerlRequired by Parent',
+ vh => 'PerlRequired by VirtualHost',
+Index: t/protocol/eliza.t
+===================================================================
+--- t/protocol/eliza.t (.../tags/2_0_3) (revision 630610)
++++ t/protocol/eliza.t (.../trunk) (revision 630610)
+@@ -5,9 +5,9 @@
+ use Apache::TestUtil;
+ use Apache::TestRequest ();
+
+-my @test_strings = ('Hello Eliza',
+- 'How are you?',
+- 'Why do I have core dumped?',
++my @test_strings = ('Hello Eliza',
++ 'How are you?',
++ 'Why do I have core dumped?',
+ 'I feel like writing some tests today, what about you?',
+ 'Good bye, Eliza');
+
+Index: t/perl/hash_attack.t
+===================================================================
+--- t/perl/hash_attack.t (.../tags/2_0_3) (revision 630610)
++++ t/perl/hash_attack.t (.../trunk) (revision 630610)
+@@ -7,7 +7,7 @@
+
+ use Apache::TestRequest 'GET_BODY_ASSERT';
+
+-plan tests => 1,
++plan tests => 1,
+ need { "relevant only for perl 5.8.2 and higher" => ($] >= 5.008002) };
+
+ my $expected = "ok";
+Index: t/modperl/sameinterp.t
+===================================================================
+--- t/modperl/sameinterp.t (.../tags/2_0_3) (revision 630610)
++++ t/modperl/sameinterp.t (.../trunk) (revision 630610)
+@@ -1,78 +0,0 @@
+-use strict;
+-use warnings FATAL => 'all';
+-
+-# run tests through the same interpreter, even if the server is
+-# running more than one
+-
+-use Apache::Test;
+-use Apache::TestUtil;
+-use Apache::TestRequest;
+-
+-use TestCommon::SameInterp;
+-
+-plan tests => 12, need 'HTML::HeadParser';
+-
+-my $url = "/TestModperl__sameinterp";
+-
+-# test the tie and re-tie
+-for (1..2) {
+- my $same_interp = Apache::TestRequest::same_interp_tie($url);
+- ok $same_interp;
+-
+- my $expected = 1;
+- my $skip = 0;
+- # test GET over the same same_interp
+- for (1..2) {
+- $expected++;
+- my $res = same_interp_req($same_interp, \&GET, $url, foo => 'bar');
+- $skip++ unless defined $res;
+- same_interp_skip_not_found(
+- $skip,
+- defined $res && $res->content,
+- $expected,
+- "GET over the same interp"
+- );
+- }
+-}
+-
+-{
+- # test POST over the same same_interp
+- my $same_interp = Apache::TestRequest::same_interp_tie($url);
+- ok $same_interp;
+-
+- my $expected = 1;
+- my $skip = 0;
+- for (1..2) {
+- $expected++;
+- my $content = join ' ', 'ok', $_ + 3;
+- my $res = same_interp_req($same_interp, \&POST, $url,
+- content => $content);
+- $skip++ unless defined $res;
+- same_interp_skip_not_found(
+- $skip,
+- defined $res && $res->content,
+- $expected,
+- "POST over the same interp"
+- );
+- }
+-}
+-
+-{
+- # test HEAD over the same same_interp
+- my $same_interp = Apache::TestRequest::same_interp_tie($url);
+- ok $same_interp;
+-
+- my $expected = 1;
+- my $skip = 0;
+- for (1..2) {
+- $expected++;
+- my $res = same_interp_req($same_interp, \&HEAD, $url);
+- $skip++ unless defined $res;
+- same_interp_skip_not_found(
+- $skip,
+- defined $res && $res->header(Apache::TestRequest::INTERP_KEY),
+- $same_interp,
+- "HEAD over the same interp"
+- );
+- }
+-}
+Index: t/modperl/pnotes2.t
+===================================================================
+--- t/modperl/pnotes2.t (.../tags/2_0_3) (revision 0)
++++ t/modperl/pnotes2.t (.../trunk) (revision 630610)
+@@ -0,0 +1,32 @@
++use strict;
++use warnings FATAL => 'all';
++
++use Apache::TestRequest qw(GET_BODY);
++use Apache::Test;
++use Apache::TestUtil;
++use Apache::TestUtil qw/t_start_error_log_watch t_finish_error_log_watch/;
++
++my $module = 'TestModperl::pnotes2';
++my $url = Apache::TestRequest::module2url($module);
++my ($u, $ok);
++
++t_debug("connecting to $url");
++
++plan tests => 12, need_lwp;
++
++Apache::TestRequest::user_agent(reset => 1, keep_alive => 0);
++
++for my $i (1..12) {
++ t_client_log_warn_is_expected();
++ t_start_error_log_watch;
++ $u="$url?$i"; $ok=GET_BODY $u;
++ select undef, undef, undef, 0.2; # give it time to write the logfile
++ ok t_cmp scalar(grep {
++ /pnotes are destroyed after cleanup passed/;
++ } t_finish_error_log_watch), 1, $u;
++}
++
++# Local Variables: #
++# mode: cperl #
++# cperl-indent-level: 4 #
++# End: #
+Index: t/modperl/cookie2.t
+===================================================================
+--- t/modperl/cookie2.t (.../tags/2_0_3) (revision 630610)
++++ t/modperl/cookie2.t (.../trunk) (revision 630610)
+@@ -14,7 +14,7 @@
+ use Apache::Test;
+ use Apache::TestUtil;
+ use Apache::TestRequest;
+-use TestCommon::SameInterp;
++Apache::TestRequest::user_agent(keep_alive => 1);
+
+ plan tests => 3, need 'HTML::HeadParser';
+
+@@ -30,21 +30,14 @@
+
+ my @tests_ordered = qw(header subprocess_env env);
+
+-t_debug "getting the same interp ID for $location";
+-my $same_interp = Apache::TestRequest::same_interp_tie($location);
+-
+-my $skip = $same_interp ? 0 : 1;
+ for my $test (@tests_ordered) {
+ my $cookie = "key=$test";
+
+- my $received = same_interp_req_body($same_interp, \&GET,
+- "$location?$test",
+- Cookie => $cookie);
+- $skip++ unless defined $received;
+- same_interp_skip_not_found(
+- $skip,
+- $received,
++ my $received = GET "$location?$test", Cookie => $cookie;
++
++ ok t_cmp(
++ $received->content,
+ $expected{$test},
+- "perl-script+SetupEnv/cookie: $test"
++ "perl-script+SetupEnv/cookie: $test",
+ );
+ }
+Index: t/modperl/cookie.t
+===================================================================
+--- t/modperl/cookie.t (.../tags/2_0_3) (revision 630610)
++++ t/modperl/cookie.t (.../trunk) (revision 630610)
+@@ -9,7 +9,7 @@
+ # this test we call $r->subprocess_env, which adds them on demand, and
+ # we are able to get the cookie via %ENV.
+ #
+-# the last sub-test makes sure that mod_cgi env vars don't persist
++# the last sub-test makes sure that mod_cgi env vars don't persist
+ # and are properly re-set at the end of each request.
+ #
+ # since the test is run against the same interpreter we also test that
+@@ -19,9 +19,8 @@
+ use Apache::Test;
+ use Apache::TestUtil;
+ use Apache::TestRequest;
++Apache::TestRequest::user_agent(keep_alive => 1);
+
+-use TestCommon::SameInterp;
+-
+ plan tests => 3, need 'HTML::HeadParser';
+
+ my $module = 'TestModperl::cookie';
+@@ -41,21 +40,17 @@
+
+ my @tests_ordered = qw(header env nocookie);
+
+-t_debug "getting the same interp ID for $location";
+-my $same_interp = Apache::TestRequest::same_interp_tie($location);
++GET $location;
+
+-my $skip = $same_interp ? 0 : 1;
+ for my $test (@tests_ordered) {
+ my $expected = $test eq 'nocookie' ? '' : "bar";
+ my @headers = ();
+ push @headers, (Cookie => $cookies{$test}) unless $test eq 'nocookie';
+
+- my $received = same_interp_req_body($same_interp, \&GET,
+- "$location?$test", @headers);
+- $skip++ unless defined $received;
+- same_interp_skip_not_found(
+- $skip,
+- $received,
++ my $received = GET "$location?$test", @headers;
++
++ ok t_cmp(
++ $received->content,
+ $expected,
+ "perl-script+SetupEnv/cookie: $test"
+ );
+Index: t/lib/TestCommon/MemoryLeak.pm
+===================================================================
+--- t/lib/TestCommon/MemoryLeak.pm (.../tags/2_0_3) (revision 630610)
++++ t/lib/TestCommon/MemoryLeak.pm (.../trunk) (revision 630610)
+@@ -18,7 +18,7 @@
+ # % t/TEST -maxclients 1 -start
+ #
+ # of course use maxclients 1 only if your test be handled with one
+-# client, e.g. proxy tests need at least two clients.
++# client, e.g. proxy tests need at least two clients.
+ #
+ # Now repeat the same test several times (more than 3)
+ #
+Index: t/lib/TestCommon/SameInterp.pm
+===================================================================
+--- t/lib/TestCommon/SameInterp.pm (.../tags/2_0_3) (revision 630610)
++++ t/lib/TestCommon/SameInterp.pm (.../trunk) (revision 630610)
+@@ -100,7 +100,7 @@
+
+ in the same_interp framework one runs
+
+- my $res = Apache::TestRequest::same_interp_do($same_interp,
++ my $res = Apache::TestRequest::same_interp_do($same_interp,
+ \&GET, $url, @data);
+
+ but if there is a failure to find the same interpreter we get an
+Index: t/lib/TestAPRlib/date.pm
+===================================================================
+--- t/lib/TestAPRlib/date.pm (.../tags/2_0_3) (revision 630610)
++++ t/lib/TestAPRlib/date.pm (.../trunk) (revision 630610)
+@@ -45,7 +45,7 @@
+ # parse_http
+ for my $date_str (@http_dates) {
+ ok t_cmp(APR::Date::parse_http($date_str),
+- $date_msec,
++ $date_msec,
+ "parse_http: $date_str");
+ #t_debug "testing : parse_http: $date_str";
+ }
+@@ -53,7 +53,7 @@
+ # parse_rfc
+ for my $date_str (@rfc_dates) {
+ ok t_cmp(APR::Date::parse_rfc($date_str),
+- $date_msec,
++ $date_msec,
+ "parse_rfc: $date_str");
+ #t_debug "testing : parse_rfc: $date_str";
+ }
+Index: t/lib/TestAPRlib/status.pm
+===================================================================
+--- t/lib/TestAPRlib/status.pm (.../tags/2_0_3) (revision 630610)
++++ t/lib/TestAPRlib/status.pm (.../trunk) (revision 630610)
+@@ -15,7 +15,7 @@
+ return 2;
+ }
+
+-sub test {
++sub test {
+ ok APR::Status::is_EAGAIN(APR::Const::EAGAIN);
+ ok ! APR::Status::is_EAGAIN(APR::Const::ENOPOLL);
+ }
+Index: t/lib/TestAPRlib/table.pm
+===================================================================
+--- t/lib/TestAPRlib/table.pm (.../tags/2_0_3) (revision 630610)
++++ t/lib/TestAPRlib/table.pm (.../trunk) (revision 630610)
+@@ -334,7 +334,7 @@
+ $table2->set($_**2 => $_**2) for 1..20;
+ my $table2_copy = APR::Table::make($pool, 1);
+ $table2_copy->set($_ => $_) for 1..20;
+-
++
+ my $overlay = $table2_copy->overlay($table2, $pool->new);
+ {
+ # see the comment for above's:
+Index: t/lib/TestAPRlib/threadrwlock.pm
+===================================================================
+--- t/lib/TestAPRlib/threadrwlock.pm (.../tags/2_0_3) (revision 0)
++++ t/lib/TestAPRlib/threadrwlock.pm (.../trunk) (revision 630610)
+@@ -0,0 +1,39 @@
++package TestAPRlib::threadrwlock;
++
++use strict;
++use warnings FATAL => 'all';
++
++use Apache::Test;
++use Apache::TestUtil;
++
++use APR::Const -compile => qw(EBUSY SUCCESS);
++use APR::Pool();
++
++sub num_of_tests {
++ return 5;
++}
++
++sub test {
++
++ require APR::ThreadRWLock;
++
++ my $pool = APR::Pool->new();
++ my $mutex = APR::ThreadRWLock->new($pool);
++
++ ok $mutex;
++
++ ok t_cmp($mutex->rdlock, APR::Const::SUCCESS,
++ 'rdlock == APR::Const::SUCCESS');
++
++ ok t_cmp($mutex->unlock, APR::Const::SUCCESS,
++ 'unlock == APR::Const::SUCCESS');
++
++ ok t_cmp($mutex->wrlock, APR::Const::SUCCESS,
++ 'wrlock == APR::Const::SUCCESS');
++
++ ok t_cmp($mutex->unlock, APR::Const::SUCCESS,
++ 'unlock == APR::Const::SUCCESS');
++
++}
++
++1;
+Index: t/lib/TestAPRlib/finfo.pm
+===================================================================
+--- t/lib/TestAPRlib/finfo.pm (.../tags/2_0_3) (revision 630610)
++++ t/lib/TestAPRlib/finfo.pm (.../trunk) (revision 630610)
+@@ -144,7 +144,7 @@
+ ok t_cmp($finfo->protection & APR::Const::FPROT_WREAD,
+ $stat->{protection} & S_IROTH,
+ '$finfo->protection() & APR::Const::FPROT_WREAD');
+- }
++ }
+ if (WIN32 and APACHE_2_2_PLUS) {
+ skip "broken apr stat on Win32", 0;
+ }
+@@ -152,7 +152,7 @@
+ ok t_cmp($finfo->protection & APR::Const::FPROT_WWRITE,
+ $stat->{protection} & S_IWOTH,
+ '$finfo->protection() & APR::Const::FPROT_WWRITE');
+- }
++ }
+ if (WIN32) {
+ skip "different file semantics", 0;
+ }
+Index: t/modules/reload.t
+===================================================================
+--- t/modules/reload.t (.../tags/2_0_3) (revision 630610)
++++ t/modules/reload.t (.../trunk) (revision 630610)
+@@ -1,107 +0,0 @@
+-use strict;
+-use warnings FATAL => 'all';
+-
+-use Apache::Test;
+-use Apache::TestUtil;
+-use Apache::TestRequest;
+-use File::Spec::Functions qw(catfile);
+-
+-use TestCommon::SameInterp;
+-
+-plan tests => 3, need 'HTML::HeadParser';
+-
+-my $test_file = catfile Apache::Test::vars("serverroot"),
+- qw(lib Apache2 Reload Test.pm);
+-
+-my $module = 'TestModules::reload';
+-my $location = '/' . Apache::TestRequest::module2path($module);
+-
+-my @tests = qw(simple const prototype subpackage);
+-
+-my $header = join '', <DATA>;
+-
+-my $initial = <<'EOF';
+-sub simple { 'simple' }
+-use constant const => 'const';
+-sub prototype($) { 'prototype' }
+-sub promised;
+-EOF
+-
+-my $modified = <<'EOF';
+-sub simple { 'SIMPLE' }
+-use constant const => 'CONST';
+-sub prototype($$) { 'PROTOTYPE' }
+-EOF
+-
+-t_write_file($test_file, $header, $initial);
+-
+-t_debug "getting the same interp ID for $location";
+-my $same_interp = Apache::TestRequest::same_interp_tie($location);
+-
+-my $skip = $same_interp ? 0 : 1;
+-
+-{
+- my $expected = join '', map { "$_:$_\n" } sort @tests;
+- my $received = same_interp_req_body($same_interp, \&GET,
+- $location);
+- $skip++ unless defined $received;
+- same_interp_skip_not_found(
+- $skip,
+- $received,
+- $expected,
+- "Initial"
+- );
+-}
+-
+-t_write_file($test_file, $header, $modified);
+-touch_mtime($test_file);
+-
+-{
+- my $expected = join '', map { "$_:" . uc($_) . "\n" } sort @tests;
+- my $received = same_interp_req_body($same_interp, \&GET,
+- $location);
+- $skip++ unless defined $received;
+- same_interp_skip_not_found(
+- $skip,
+- $received,
+- $expected,
+- "Reload"
+- );
+-}
+-
+-{
+- my $expected = "unregistered OK";
+- my $received = same_interp_req_body($same_interp, \&GET,
+- $location . '?last' );
+- $skip++ unless defined $received;
+- same_interp_skip_not_found(
+- $skip,
+- $received,
+- $expected,
+- "Unregister"
+- );
+-}
+-
+-sub touch_mtime {
+- my $file = shift;
+- # push the mtime into the future (at least 2 secs to work on win32)
+- # so Apache2::Reload will reload the package
+- my $time = time + 5; # make it 5 to be sure
+- utime $time, $time, $file;
+-}
+-
+-__DATA__
+-package Apache2::Reload::Test;
+-
+-use Apache2::Reload;
+-
+-our @methods = qw(simple const prototype subpackage);
+-
+-sub subpackage { return Apache2::Reload::Test::SubPackage::subpackage() }
+-
+-sub run {
+- my $r = shift;
+- foreach my $m (sort @methods) {
+- $r->print($m, ':', __PACKAGE__->$m(), "\n");
+- }
+-}
+Index: t/modules/apache_status.t
+===================================================================
+--- t/modules/apache_status.t (.../tags/2_0_3) (revision 630610)
++++ t/modules/apache_status.t (.../trunk) (revision 630610)
+@@ -18,13 +18,9 @@
+ {
+ my $url = "$base_url";
+ my $body = GET_BODY_ASSERT $url;
+- (my $pver = $]) =~ s/00//;
+- $pver =~ s/(\d\.\d)(.*)/"$1." . ($2 ? int($2) : 0)/e;
+- #t_debug $body;
+- t_debug $pver;
+- # expecting: Embedded Perl version v5.8.2 for ...
+- ok $body =~ /$pver/;
+-
++ # expecting: Embedded Perl version <b>v5.8.2</b> for ...
++ my $pver = $^V ? sprintf "v%vd", $^V : $];
++ ok t_cmp($body, qr[Embedded Perl version <b>$pver</b> for]);
+ # menu_item, part 1
+ # expecting: Test Entry
+ ok $body =~ /Test Menu Entry/;
+Index: t/directive/perl.t
+===================================================================
+--- t/directive/perl.t (.../tags/2_0_3) (revision 630610)
++++ t/directive/perl.t (.../trunk) (revision 630610)
+@@ -10,7 +10,7 @@
+ my @auth = (Authorization => 'Basic ZG91Z206Zm9v'); #dougm:foo
+
+
+-foreach my $location ("/perl_sections/index.html",
++foreach my $location ("/perl_sections/index.html",
+ "/perl_sections_readconfig/index.html") {
+
+ sok {
+Index: lib/ModPerl/WrapXS.pm
+===================================================================
+--- lib/ModPerl/WrapXS.pm (.../tags/2_0_3) (revision 630610)
++++ lib/ModPerl/WrapXS.pm (.../trunk) (revision 630610)
+@@ -289,7 +289,7 @@
+ EOF
+ }
+ elsif ($access_mode eq 'rw_char_undef') {
+- my $pool = $e->{pool}
++ my $pool = $e->{pool}
+ or die "rw_char_undef accessors need pool";
+ $pool .= '(obj)';
+ # XXX: not sure where val=$default is coming from, but for now use
+@@ -595,8 +595,9 @@
+ }
+ }
+
+- if ($module eq 'APR::Pool') {
++ if ($module eq 'APR::Pool' && Apache2::Build::PERL_HAS_ITHREADS) {
+ print $fh " modperl_opt_interp_unselect = APR_RETRIEVE_OPTIONAL_FN(modperl_interp_unselect);\n\n";
++ print $fh " modperl_opt_thx_interp_get = APR_RETRIEVE_OPTIONAL_FN(modperl_thx_interp_get);\n\n";
+ }
+
+ close $fh;
+@@ -778,7 +779,7 @@
+ my $objects;
+
+ sub _get_modules {
+- for my $method (sort keys %$methods) {
++ for my $method (sort keys %$methods) {
+ for my $item ( @{ $methods->{$method} }) {
+ push @{ $modules->{$item->[MODULE]} }, [$method, $item->[OBJECT]];
+ }
+@@ -786,7 +787,7 @@
+ }
+
+ sub _get_objects {
+- for my $method (sort keys %$methods) {
++ for my $method (sort keys %$methods) {
+ for my $item ( @{ $methods->{$method} }) {
+ next unless defined $item->[OBJECT];
+ push @{ $objects->{$item->[OBJECT]} }, [$method, $item->[MODULE]];
+@@ -945,7 +946,7 @@
+ my @args = @_ ? @_ : @ARGV;
+ while (@args) {
+ my $method = shift @args;
+- my $object = (@args &&
++ my $object = (@args &&
+ (ref($args[0]) || $args[0] =~ /^(Apache2|ModPerl|APR)/))
+ ? shift @args
+ : undef;
+@@ -1065,7 +1066,7 @@
+ my $format = "%-${max_len}s %s\n";
+ my $banner = sprintf($format, "Method", "Invoked on object type");
+ my $hint = join '',
+- ("\nModule '$module' contains the following XS methods:\n\n",
++ ("\nModule '$module' contains the following XS methods:\n\n",
+ $banner, sep(length($banner)),
+ map( { sprintf $format, $_->[0], $_->[1]||'???'}
+ @{ $modules->{$module} }),
+@@ -1225,10 +1226,10 @@
+ if (my $attr = $entry->{attr}) {
+ return 1 if grep { $_ eq 'static' } @$attr;
+ }
+-
++
+ #C::Scan doesnt always pickup static __inline__
+ return 1 if $entry->{name} =~ /^mpxs_/o;
+-
++
+ return 0;
+ }
+
+@@ -1297,7 +1298,7 @@
+ while (my ($key, $table) = each %files) {
+ my $handles = $self->open_export_files($key, $ext);
+
+- my %seen; #only write header once if this is a single file
++ my %seen; #only write header once if this is a single file
+ for my $fh (values %$handles) {
+ next if $seen{$fh}++;
+ print $fh $self->$header();
+@@ -1356,14 +1357,14 @@
+ EOF
+ return;
+ }
+-
++
+ print $fh <<"EOF";
+-/*
++/*
+ * This is indeed a ugly hack!
+ * See also src/modules/perl/mod_perl.c for modperl_ugly_hack
+ * If we don't build such a list of exported API functions, the over-zealous
+ * linker can and will remove the unused functions completely. In order to
+- * avoid this, we create this object and modperl_ugly_hack to create a
++ * avoid this, we create this object and modperl_ugly_hack to create a
+ * dependency between all the exported API and mod_perl.c
+ */
+ const void *modperl_ugly_hack = NULL;
+Index: lib/ModPerl/Config.pm
+===================================================================
+--- lib/ModPerl/Config.pm (.../tags/2_0_3) (revision 630610)
++++ lib/ModPerl/Config.pm (.../trunk) (revision 630610)
+@@ -56,7 +56,7 @@
+ $cfg .= qx{$command};
+
+ $cfg .= Apache::TestConfig::ldd_as_string($httpd);
+- }
++ }
+ else {
+ $cfg .= "\n\n*** The httpd binary was not found\n";
+ }
+Index: lib/ModPerl/Manifest.pm
+===================================================================
+--- lib/ModPerl/Manifest.pm (.../tags/2_0_3) (revision 630610)
++++ lib/ModPerl/Manifest.pm (.../trunk) (revision 630610)
+@@ -40,7 +40,7 @@
+ my @files;
+
+ my $cwd = Cwd::cwd();
+- my @lines = `svn status -v` ;
++ my @lines = `svn status -v` ;
+ foreach my $line (@lines) {
+ chomp $line;
+ if ($line =~ /(?:\d+)\s+(?:\d+)\s+(?:\w+)\s+(.*)\s*/) {
+Index: lib/ModPerl/CScan.pm
+===================================================================
+--- lib/ModPerl/CScan.pm (.../tags/2_0_3) (revision 630610)
++++ lib/ModPerl/CScan.pm (.../trunk) (revision 630610)
+@@ -8,7 +8,7 @@
+ # it's not a requirement for mod_perl users
+ use Data::Flow qw(0.05);
+
+-use strict; # Earlier it catches ISA and EXPORT.
++use strict; # Earlier it catches ISA and EXPORT.
+
+ @ModPerl::CScan::ISA = qw(Exporter Data::Flow);
+
+@@ -17,9 +17,9 @@
+ # Do not simply export all your public functions/methods/constants.
+
+ @ModPerl::CScan::EXPORT = qw(
+- );
++ );
+ @ModPerl::CScan::EXPORT_OK = qw(
+- );
++ );
+ # this flag tells cpp to only output macros
+ $ModPerl::CScan::MACROS_ONLY = '-dM';
+
+@@ -38,8 +38,8 @@
+ for (qw(__func__ _Complex _Imaginary _Bool inline restrict)) {
+ $style_keywords{'C9X'}{$_}++;
+ }
+-for (qw(inline const asm noreturn section
+- constructor destructor unused weak)) {
++for (qw(inline const asm noreturn section
++ constructor destructor unused weak)) {
+ $style_keywords{'GNU'}{$_}++;
+ $style_keywords{'GNU'}{"__$ {_}__"}++;
+ }
+@@ -57,37 +57,37 @@
+ c_styles => { default => [qw(C++ GNU C9X)] },
+ add_cppflags => { default => '' },
+ keywords => { prerequisites => ['c_styles'],
+- output => sub {
+- my %kw = %keywords;
+- my %add;
+- for ( @{ shift->{c_styles} } ) {
+- %add = %{ $style_keywords{$_} };
+- %kw = (%kw, %add);
+- }
+- \%kw;
+- }, },
++ output => sub {
++ my %kw = %keywords;
++ my %add;
++ for ( @{ shift->{c_styles} } ) {
++ %add = %{ $style_keywords{$_} };
++ %kw = (%kw, %add);
++ }
++ \%kw;
++ }, },
+ 'undef' => { default => undef },
+ filename_filter => { default => undef },
+ full_text => { class_filter => [ 'text', 'C::Preprocessed',
+- qw(undef filename Defines includeDirs Cpp)] },
++ qw(undef filename Defines includeDirs Cpp)] },
+ text => { class_filter => [ 'text', 'C::Preprocessed',
+- qw(filename_filter filename Defines includeDirs Cpp)] },
++ qw(filename_filter filename Defines includeDirs Cpp)] },
+ text_only_from => { class_filter => [ 'text_only_from', 'C::Preprocessed',
+- qw(filename_filter filename Defines includeDirs Cpp)] },
+- includes => { filter => [ \&includes,
+- qw(filename Defines includeDirs Cpp) ], },
+- includeDirs => { prerequisites => ['filedir'],
+- output => sub {
+- my $data = shift;
+- [ $data->{filedir}, '/usr/local/include', '.'];
+- } },
+- Cpp => { prerequisites => [qw(cppminus add_cppflags cppflags cppstdin)],
+- output => sub {
+- my $data = shift;
+- return { cppstdin => $data->{cppstdin},
+- cppflags => "$data->{cppflags} $data->{add_cppflags}",
+- cppminus => $data->{cppminus} };
+- } },
++ qw(filename_filter filename Defines includeDirs Cpp)] },
++ includes => { filter => [ \&includes,
++ qw(filename Defines includeDirs Cpp) ], },
++ includeDirs => { prerequisites => ['filedir'],
++ output => sub {
++ my $data = shift;
++ [ $data->{filedir}, '/usr/local/include', '.'];
++ } },
++ Cpp => { prerequisites => [qw(cppminus add_cppflags cppflags cppstdin)],
++ output => sub {
++ my $data = shift;
++ return { cppstdin => $data->{cppstdin},
++ cppflags => "$data->{cppflags} $data->{add_cppflags}",
++ cppminus => $data->{cppminus} };
++ } },
+ filedir => { output => sub { dirname ( shift->{filename} || '.' ) } },
+ sanitized => { filter => [ \&sanitize, 'text'], },
+ toplevel => { filter => [ \&top_level, 'sanitized'], },
+@@ -97,30 +97,30 @@
+ typedef_chunks => { filter => [ \&typedef_chunks, 'full_toplevel'], },
+ struct_chunks => { filter => [ \&struct_chunks, 'full_toplevel'], },
+ typedefs_whited => { filter => [ \&typedefs_whited,
+- 'full_sanitized', 'typedef_chunks',
+- 'keywords_rex'], },
++ 'full_sanitized', 'typedef_chunks',
++ 'keywords_rex'], },
+ typedef_texts => { filter => [ \&typedef_texts,
+- 'full_text', 'typedef_chunks'], },
++ 'full_text', 'typedef_chunks'], },
+ struct_texts => { filter => [ \&typedef_texts,
+- 'full_text', 'struct_chunks'], },
++ 'full_text', 'struct_chunks'], },
+ typedef_hash => { filter => [ \&typedef_hash,
+- 'typedef_texts', 'typedefs_whited'], },
++ 'typedef_texts', 'typedefs_whited'], },
+ typedef_structs => { filter => [ \&typedef_structs,
+- 'typedef_hash', 'struct_texts'], },
++ 'typedef_hash', 'struct_texts'], },
+ typedefs_maybe => { filter => [ sub {[keys %{+shift}]},
+- 'typedef_hash'], },
++ 'typedef_hash'], },
+ defines_maybe => { filter => [ \&defines_maybe, 'filename'], },
+ defines_no_args => { prerequisites => ['defines_maybe'],
+- output => sub { shift->{defines_maybe}->[0] }, },
++ output => sub { shift->{defines_maybe}->[0] }, },
+ defines_args => { prerequisites => ['defines_maybe'],
+- output => sub { shift->{defines_maybe}->[1] }, },
++ output => sub { shift->{defines_maybe}->[1] }, },
+
+- defines_full => { filter => [ \&defines_full,
+- qw(filename Defines includeDirs Cpp) ], },
++ defines_full => { filter => [ \&defines_full,
++ qw(filename Defines includeDirs Cpp) ], },
+ defines_no_args_full => { prerequisites => ['defines_full'],
+- output => sub { shift->{defines_full}->[0] }, },
++ output => sub { shift->{defines_full}->[0] }, },
+ defines_args_full => { prerequisites => ['defines_full'],
+- output => sub { shift->{defines_full}->[1] }, },
++ output => sub { shift->{defines_full}->[1] }, },
+
+ decl_inlines => { filter => [ \&functions_in, 'no_type_decl'], },
+ inline_chunks => { filter => [ sub { shift->[0] }, 'decl_inlines'], },
+@@ -134,13 +134,13 @@
+ vdecl_chunks => { filter => [ sub { shift->[3] }, 'decl_inlines'], },
+ vdecls => { filter => [ \&from_chunks, 'vdecl_chunks', 'text'], },
+ vdecl_hash => { filter => [ \&vdecl_hash, 'vdecls', 'mdecls' ], },
+- parsed_fdecls => { filter => [ \&do_declarations, 'fdecls',
+- 'typedef_hash', 'keywords'], },
++ parsed_fdecls => { filter => [ \&do_declarations, 'fdecls',
++ 'typedef_hash', 'keywords'], },
+ keywords_rex => { filter => [ sub { my @k = keys %{ shift() };
+- local $" = '|';
+- my $r = "(?:@k)";
+- eval 'qr/$r/' or $r # Older Perls
+- }, 'keywords'], },
++ local $" = '|';
++ my $r = "(?:@k)";
++ eval 'qr/$r/' or $r # Older Perls
++ }, 'keywords'], },
+ };
+
+ sub from_chunks {
+@@ -164,11 +164,11 @@
+ or die "Cannot open pipe from cppstdin: $!\n";
+
+ while (<$stream>) {
+- next unless m(^\s*\#\s* # Leading hash
+- (line\s*)? # 1: Optional line
+- ([0-9]+)\s* # 2: Line number
+- (.*) # 3: The rest
+- )x;
++ next unless m(^\s*\#\s* # Leading hash
++ (line\s*)? # 1: Optional line
++ ([0-9]+)\s* # 2: Line number
++ (.*) # 3: The rest
++ )x;
+ my $include = $3;
+ $include = $1 if $include =~ /"(.*)"/; # Filename may be in quotes
+ $include =~ s,\\\\,/,g if $^O eq 'os2';
+@@ -182,19 +182,19 @@
+ my ($mline,$line,%macros,%macrosargs,$sym,$args);
+ open(C, $file) or die "Cannot open file $file: $!\n";
+ while (not eof(C) and $line = <C>) {
+- next unless
++ next unless
+ ( $line =~ s[
+- ^ \s* \# \s* # Start of directive
+- define \s+
+- (\w+) # 1: symbol
+- (?:
+- \( (.*?) \s* \) # 2: Minimal match for arguments
++ ^ \s* \# \s* # Start of directive
++ define \s+
++ (\w+) # 1: symbol
++ (?:
++ \( (.*?) \s* \) # 2: Minimal match for arguments
+ # in parenths (without trailing
+ # spaces)
+- )? # optional, no grouping
+- \s* # rest is the definition
+- ([\s\S]*) # 3: the rest
+- ][]x );
++ )? # optional, no grouping
++ \s* # rest is the definition
++ ([\s\S]*) # 3: the rest
++ ][]x );
+ ($sym, $args, $mline) = ($1, $2, $3);
+ $mline .= <C> while not eof(C) and $mline =~ s/\\\n/\n/;
+ chomp $mline;
+@@ -221,19 +221,19 @@
+ or die "Cannot open pipe from cppstdin: $!\n";
+
+ while (defined ($line = <$stream>)) {
+- next unless
++ next unless
+ ( $line =~ s[
+- ^ \s* \# \s* # Start of directive
+- define \s+
+- (\w+) # 1: symbol
+- (?:
+- \( (.*?) \s* \) # 2: Minimal match for arguments
++ ^ \s* \# \s* # Start of directive
++ define \s+
++ (\w+) # 1: symbol
++ (?:
++ \( (.*?) \s* \) # 2: Minimal match for arguments
+ # in parenths (without trailing
+ # spaces)
+- )? # optional, no grouping
+- \s* # rest is the definition
+- ([\s\S]*) # 3: the rest
+- ][]x );
++ )? # optional, no grouping
++ \s* # rest is the definition
++ ([\s\S]*) # 3: the rest
++ ][]x );
+ ($sym, $args, $mline) = ($1, $2, $3);
+ $mline .= <$stream> while ($mline =~ s/\\\n/\n/);
+ chomp $mline;
+@@ -249,7 +249,7 @@
+ [\%macros, \%macrosargs];
+ }
+
+-sub typedef_chunks { # Input is toplevel, output: starts and ends
++sub typedef_chunks { # Input is toplevel, output: starts and ends
+ my $txt = shift;
+ pos $txt = 0;
+ my ($b, $e, @out);
+@@ -273,7 +273,7 @@
+ \@out;
+ }
+
+-sub typedefs_whited { # Input is sanitized text, and list of beg/end.
++sub typedefs_whited { # Input is sanitized text, and list of beg/end.
+ my @lst = @{$_[1]};
+ my @out;
+ my ($b, $e);
+@@ -325,35 +325,35 @@
+ $wh =~ /,/g;
+ my $p = pos $wh;
+ my ($s, $e);
+- if (matchingbrace($wh)) { # Inside. Easy part: just split on /,/...
+- $e = pos($wh) - 1;
+- $s = $e;
+- my $d = 0;
+- # Skip back
+- while (--$s >= 0) {
+- my $c = substr $wh, $s, 1;
+- if ($c =~ /[\(\{\[]/) {
+- $d--;
+- } elsif ($c =~ /[\)\]\}]/) {
+- $d++;
+- }
+- last if $d < 0;
+- }
+- if ($s < 0) { # Should not happen
+- warn("panic: could not match braces in\n\t$td\nwhited as\n\t$wh\n");
+- next loop;
+- }
+- $s++;
+- } else { # We are at toplevel
+- # We need to skip back all the modifiers attached to the first thingy
+- # Guesstimates: everything after the first '*' (inclusive)
+- pos $wh = 0;
+- $wh = /(?=\w)/g;
+- my $ws = pos $wh;
+- my $pre = substr $wh, 0, $ws;
+- $s = $ws;
+- $s = pos $pre if $pre =~ /(?=\*)/g;
+- $e = length $wh;
++ if (matchingbrace($wh)) { # Inside. Easy part: just split on /,/...
++ $e = pos($wh) - 1;
++ $s = $e;
++ my $d = 0;
++ # Skip back
++ while (--$s >= 0) {
++ my $c = substr $wh, $s, 1;
++ if ($c =~ /[\(\{\[]/) {
++ $d--;
++ } elsif ($c =~ /[\)\]\}]/) {
++ $d++;
++ }
++ last if $d < 0;
++ }
++ if ($s < 0) { # Should not happen
++ warn("panic: could not match braces in\n\t$td\nwhited as\n\t$wh\n");
++ next loop;
++ }
++ $s++;
++ } else { # We are at toplevel
++ # We need to skip back all the modifiers attached to the first thingy
++ # Guesstimates: everything after the first '*' (inclusive)
++ pos $wh = 0;
++ $wh = /(?=\w)/g;
++ my $ws = pos $wh;
++ my $pre = substr $wh, 0, $ws;
++ $s = $ws;
++ $s = pos $pre if $pre =~ /(?=\*)/g;
++ $e = length $wh;
+ }
+ # Now: need to split $td based on commas in $wh!
+ # And need to split each chunk of $td based on word in the chunk of $wh!
+@@ -364,29 +364,29 @@
+ my $td_s = 0;
+ my (@td_decl, @td_pre, @td_post, @td_word);
+ for my $wh_d (@wh_decls) {
+- my $td_d = substr $td, $td_s, length $wh_d;
+- push @td_decl, $td_d;
+- $wh_d =~ /(\w+)/g;
+- push @td_word, $1;
+- push @td_post, substr $td_d, pos($wh_d);
+- push @td_pre, substr $td_d, pos($wh_d) - length $1, length $1;
+- $td_s += 1 + length $wh_d; # Skip over ','
++ my $td_d = substr $td, $td_s, length $wh_d;
++ push @td_decl, $td_d;
++ $wh_d =~ /(\w+)/g;
++ push @td_word, $1;
++ push @td_post, substr $td_d, pos($wh_d);
++ push @td_pre, substr $td_d, pos($wh_d) - length $1, length $1;
++ $td_s += 1 + length $wh_d; # Skip over ','
+ }
+ for my $i (0..$#wh_decls) {
+- my $p = "$td_post[$i]$post";
+- $p = '' unless $p =~ /\S/;
+- $out{$td_word[$i]} = ["$pre$td_pre[$i]", $p];
++ my $p = "$td_post[$i]$post";
++ $p = '' unless $p =~ /\S/;
++ $out{$td_word[$i]} = ["$pre$td_pre[$i]", $p];
+ }
+- } elsif ($td =~ /\(\s* \*? \s* ([^)]+) \s* \) \s* \(.*\)/gxs){ # XXX: function pointer typedef
++ } elsif ($td =~ /\(\s* \*? \s* ([^)]+) \s* \) \s* \(.*\)/gxs){ # XXX: function pointer typedef
+ $out{$1} = ['XXX: pre_foo', 'XXX: post_bar']; # XXX: not sure what to stuff here
+ #warn "[$1] [$td]" if $verb;
+- } else { # Only one thing defined...
++ } else { # Only one thing defined...
+ $wh =~ /(\w+)/g;
+- my $e = pos $wh;
+- my $s = $e - length $1;
+- my $type = $1;
+- my $pre = substr $td, 0, $s;
+- my $post = substr $td, $e, length($td) - $e;
++ my $e = pos $wh;
++ my $s = $e - length $1;
++ my $type = $1;
++ my $pre = substr $td, 0, $s;
++ my $post = substr $td, $e, length($td) - $e;
+ $post = '' unless $post =~ /\S/;
+ $out{$type} = [$pre, $post];
+ }
+@@ -459,18 +459,18 @@
+ $word = $1;
+ if ($word eq ';' || $word eq '') {
+ next unless defined $id;
+- $type = 'int' unless defined $type; # or is this an error?
++ $type = 'int' unless defined $type; # or is this an error?
+ push @$vars, [ $type, $post, $id ];
+ ($type, $post, $id, $func) = (undef, undef, undef);
+ } elsif ($word eq ',') {
+ warn "panic: expecting name before comma in '$in'\n" unless defined $id;
+- $type = 'int' unless defined $type; # or is this an error?
++ $type = 'int' unless defined $type; # or is this an error?
+ push @$vars, [ $type, $post, $id ];
+ $type =~ s/[ *]*$//;
+ $id = undef;
+ } elsif ($word eq '[') {
+ warn "panic: expecting name before '[' in '$in'\n" unless defined $id;
+- $type = 'int' unless defined $type; # or is this an error?
++ $type = 'int' unless defined $type; # or is this an error?
+ my $b = pos $in;
+ matchingbrace($in);
+ $post .= $word . substr $in, $b, pos($in) - $b;
+@@ -479,15 +479,15 @@
+ $type = join ' ', grep defined, $type, $id if defined $id;
+ $type = 'int' unless defined $type;
+ if ($in =~ /\G\s*(\*[\s\*]*?)\s*(\w+)[\[\]\d\s]*(\)\s*\()/gc) {
+- $type .= "($1";
+- $id = $2;
+- $post = $3;
+- my $b = pos $in;
+- matchingbrace($in);
+- $post .= substr $in, $b, pos($in) - $b;
++ $type .= "($1";
++ $id = $2;
++ $post = $3;
++ my $b = pos $in;
++ matchingbrace($in);
++ $post .= substr $in, $b, pos($in) - $b;
+ } else {
+- warn "panic: can't parse function pointer declaration in '$in'\n";
+- return;
++ warn "panic: can't parse function pointer declaration in '$in'\n";
++ return;
+ }
+ } elsif ($word =~ /^:/) {
+ # bitfield
+@@ -495,14 +495,14 @@
+ $post .= $word;
+ } else {
+ if (defined $post) {
+- if ($func) {
+- $post .= $word;
+- } else {
+- warn "panic: not expecting '$word' after array bounds in '$in'\n";
+- }
++ if ($func) {
++ $post .= $word;
++ } else {
++ warn "panic: not expecting '$word' after array bounds in '$in'\n";
++ }
+ } else {
+- $type = join ' ', grep defined, $type, $id if defined $id;
+- $id = $word;
++ $type = join ' ', grep defined, $type, $id if defined $id;
++ $id = $word;
+ }
+ }
+ }
+@@ -517,7 +517,7 @@
+ my ($vdecls, $mdecls) = @_;
+ my %vdecl_hash;
+ for (@$vdecls, @$mdecls) {
+- next if /[()]/; # ignore functions, and function pointers
++ next if /[()]/; # ignore functions, and function pointers
+ my $copy = $_;
+ next unless $copy =~ s/^\s*extern\s*//;
+ my $vars = parse_vars($copy);
+@@ -529,8 +529,8 @@
+ # The output is the list of list of inline chunks and list of
+ # declaration chunks.
+
+-sub functions_in { # The arg is text without type declarations.
+- my $in = shift; # remove_type_decl(top_level(sanitize($txt)));
++sub functions_in { # The arg is text without type declarations.
++ my $in = shift; # remove_type_decl(top_level(sanitize($txt)));
+ # What remains now consists of variable and function declarations,
+ # and inline functions.
+ $in =~ /(?=\S)/g;
+@@ -542,7 +542,7 @@
+ $e = pos $in;
+ $chunk = substr $in, $b, $e - $b;
+ # Now subdivide the chunk.
+- #
++ #
+ # What we got is one chunk, probably finished by `;'. Whoever, it
+ # may start with several inline functions.
+ #
+@@ -552,39 +552,39 @@
+ $e1 = pos $chunk;
+ push @inlines, $b + $b1, $b + $e1;
+ $chunk =~ /(?=\S)/g;
+- $b1 = pos $chunk;
++ $b1 = pos $chunk;
+ $b1 = length $chunk, last unless defined $b1;
+ }
+ if ($e - $b - $b1 > 0) {
+ my ($isvar, $isfunc) = (1, 1);
+ substr ($chunk, 0, $b1) = '';
+- if ($chunk =~ /,/) { # Contains multiple declarations.
+- push @mdecls, $b + $b1, $e;
+- } else { # Non-multiple.
+- # Since leading \s* is not optimized, this is quadratic!
+- $chunk =~ s{
+- ( ( const | __const
+- | __attribute__ \s* \( \s* \)
+- ) \s* )* ( ; \s* )? \Z # Strip from the end
+- }()x;
+- $chunk =~ s/\s*\Z//;
+- if ($chunk =~ /\)\Z/) { # Function declaration ends on ")"!
+- if ($chunk !~ m{
+- \( .* \( # Multiple parenths
+- }x
+- and $chunk =~ / \w \s* \( /x) { # Most probably pointer to a function?
+- $isvar = 0;
+- }
+- } elsif ($chunk =~ /
+- ^ \s* (enum|struct|union|class) \s+ \w+ \s* $
+- /x) {
+- $isvar = $isfunc = 0;
+- }
+- if ($isvar) { # Heuristically variable
+- push @vdecls, $b + $b1, $e;
+- } elsif ($isfunc) {
+- push @fdecls, $b + $b1, $e;
+- }
++ if ($chunk =~ /,/) { # Contains multiple declarations.
++ push @mdecls, $b + $b1, $e;
++ } else { # Non-multiple.
++ # Since leading \s* is not optimized, this is quadratic!
++ $chunk =~ s{
++ ( ( const | __const
++ | __attribute__ \s* \( \s* \)
++ ) \s* )* ( ; \s* )? \Z # Strip from the end
++ }()x;
++ $chunk =~ s/\s*\Z//;
++ if ($chunk =~ /\)\Z/) { # Function declaration ends on ")"!
++ if ($chunk !~ m{
++ \( .* \( # Multiple parenths
++ }x
++ and $chunk =~ / \w \s* \( /x) { # Most probably pointer to a function?
++ $isvar = 0;
++ }
++ } elsif ($chunk =~ /
++ ^ \s* (enum|struct|union|class) \s+ \w+ \s* $
++ /x) {
++ $isvar = $isfunc = 0;
++ }
++ if ($isvar) { # Heuristically variable
++ push @vdecls, $b + $b1, $e;
++ } elsif ($isfunc) {
++ push @fdecls, $b + $b1, $e;
++ }
+ }
+ push @decls, $b + $b1, $e if $isvar || $isfunc;
+ }
+@@ -602,15 +602,15 @@
+ # Remove function arguments using heuristics methods.
+ # Now out of several words in a row the last one is a newly defined type.
+
+-sub whited_decl { # Input is sanitized.
++sub whited_decl { # Input is sanitized.
+ my $keywords_rex = shift;
+- my $in = shift; # Text of a declaration
++ my $in = shift; # Text of a declaration
+
+ #typedef ret_type*(*func) -> typedef ret_type* (*func)
+ $in =~ s/\*\(\*/* \(*/;
+
+ my $rest = $in;
+- my $out = $in; # Whited out $in
++ my $out = $in; # Whited out $in
+
+ # Remove all the structs
+ while ($out =~ /(\b(struct|union|class|enum)(\s+\w+)?\s*\{)/g) {
+@@ -619,7 +619,7 @@
+ matchingbrace($out);
+ my $pos_end = pos $out;
+ substr($out, $pos_start, $pos_end - $pos_start) =
+- ' ' x ($pos_end - $pos_start);
++ ' ' x ($pos_end - $pos_start);
+ pos $out = $pos_end;
+ }
+
+@@ -635,7 +635,7 @@
+
+ # Remove the __attribute__ tag.
+ substr($out, $att_pos_start, $att_pos_end - $att_pos_start) =
+- ' ' x ($att_pos_end - $att_pos_start);
++ ' ' x ($att_pos_end - $att_pos_start);
+ pos $out = $att_pos_end;
+ }
+
+@@ -694,7 +694,7 @@
+ return 1 if $n < 0;
+ }
+ # pos($_[0]) is after the closing brace now
+- return; # false
++ return; # false
+ }
+
+ sub remove_Comments_no_Strings { # We expect that no strings are around
+@@ -704,30 +704,30 @@
+ $in;
+ }
+
+-sub sanitize { # We expect that no strings are around
++sub sanitize { # We expect that no strings are around
+ my $in = shift;
+ # C and C++, strings and characters
+ $in =~ s{ / (
+- / .* # C++ style
+- |
+- \* [\s\S]*? \*/ # C style
+- ) # (1)
+- | '((?:[^\\\']|\\.)+)' # (2) Character constants
+- | "((?:[^\\\"]|\\.)*)" # (3) Strings
+- | ( ^ \s* \# .* # (4) Preprocessor
+- ( \\ $ \n .* )* ) # and continuation lines
+- } {
+- # We want to preserve the length, so that one may go back
+- defined $1 ? ' ' x (1 + length $1) :
+- defined $4 ? ' ' x length $4 :
+- defined $2 ? "'" . ' ' x length($2) . "'" :
+- defined $3 ? '"' . ' ' x length($3) . '"' : '???'
+- }xgem ;
++ / .* # C++ style
++ |
++ \* [\s\S]*? \*/ # C style
++ ) # (1)
++ | '((?:[^\\\']|\\.)+)' # (2) Character constants
++ | "((?:[^\\\"]|\\.)*)" # (3) Strings
++ | ( ^ \s* \# .* # (4) Preprocessor
++ ( \\ $ \n .* )* ) # and continuation lines
++ } {
++ # We want to preserve the length, so that one may go back
++ defined $1 ? ' ' x (1 + length $1) :
++ defined $4 ? ' ' x length $4 :
++ defined $2 ? "'" . ' ' x length($2) . "'" :
++ defined $3 ? '"' . ' ' x length($3) . '"' : '???'
++ }xgem ;
+ die "Unfinished comment" if $in =~ m{ /\* }x;
+ $in;
+ }
+
+-sub top_level { # We expect argument is sanitized
++sub top_level { # We expect argument is sanitized
+ # Note that this may remove the variable in declaration: int (*func)();
+ my $in = shift;
+ my $start;
+@@ -735,18 +735,18 @@
+ while ($in =~ /[\[\{\(]/g ) {
+ $start = pos $in;
+ matchingbrace($in);
+- substr($out, $start, pos($in) - 1 - $start)
++ substr($out, $start, pos($in) - 1 - $start)
+ = ' ' x (pos($in) - 1 - $start);
+ }
+ $out;
+ }
+
+-sub remove_type_decl { # We suppose that the arg is top-level only.
++sub remove_type_decl { # We suppose that the arg is top-level only.
+ my $in = shift;
+ $in =~ s/(\b__extension__)(\s+typedef\b)/(' ' x length $1) . $2/gse;
+ $in =~ s/(\btypedef\b.*?;)/' ' x length $1/gse;
+ # The following form may appear only in the declaration of the type itself:
+- $in =~
++ $in =~
+ s/(\b(enum|struct|union|class)\b[\s\w]*\{\s*\}\s*;)/' ' x length $1/gse;
+ $in;
+ }
+@@ -830,10 +830,10 @@
+ my $p = 0;
+ my $arg;
+ while ($top =~ /,/g) {
+- $arg = substr($argstring, $p, pos($top) - 1 - $p);
+- $arg =~ s/^\s+|\s+$//gs;
+- push @args, $arg;
+- $p = pos $top;
++ $arg = substr($argstring, $p, pos($top) - 1 - $p);
++ $arg =~ s/^\s+|\s+$//gs;
++ push @args, $arg;
++ $p = pos $top;
+ }
+ $arg = substr $argstring, $p;
+ $arg =~ s/^\s+|\s+$//gs;
+@@ -877,7 +877,7 @@
+ $ident = "arg$argnum";
+ }
+ } else {
+- die "Cannot process declaration `$decl' without an identifier"
++ die "Cannot process declaration `$decl' without an identifier"
+ unless $decl =~ /\G(\w+)/g;
+ $ident = $1;
+ $pos = pos $decl;
+@@ -904,10 +904,10 @@
+ my $p = 0;
+ my $arg;
+ while ($top =~ /,/g) {
+- $arg = substr($argstring, $p, pos($top) - 1 - $p);
+- $arg =~ s/^\s+|\s+$//gs;
+- push @args, $arg;
+- $p = pos $top;
++ $arg = substr($argstring, $p, pos($top) - 1 - $p);
++ $arg =~ s/^\s+|\s+$//gs;
++ push @args, $arg;
++ $p = pos $top;
+ }
+ $arg = substr $argstring, $p;
+ $arg =~ s/^\s+|\s+$//gs;
+@@ -930,9 +930,9 @@
+ use constant WIN32 => $^O eq 'MSWin32';
+
+ sub new {
+- die "usage: C::Preprocessed->new(filename[, defines[, includes[, cpp]]])"
++ die "usage: C::Preprocessed->new(filename[, defines[, includes[, cpp]]])"
+ if @_ < 2 or @_ > 5;
+- my ($class, $filename, $Defines, $Includes, $Cpp)
++ my ($class, $filename, $Defines, $Includes, $Cpp)
+ = (shift, shift, shift, shift, shift);
+ $Cpp ||= \%Config::Config;
+ my $filedir = dirname $filename || '.';
+@@ -980,7 +980,7 @@
+ }
+
+ sub DESTROY {
+- close($_[0])
++ close($_[0])
+ or die "Cannot close pipe from `$Config::Config{cppstdin}': err $?, $!\n";
+ }
+
+Index: lib/ModPerl/BuildMM.pm
+===================================================================
+--- lib/ModPerl/BuildMM.pm (.../tags/2_0_3) (revision 630610)
++++ lib/ModPerl/BuildMM.pm (.../trunk) (revision 630610)
+@@ -267,7 +267,7 @@
+ my $podpath = catfile $doc_root, $pod;
+ next unless -r $podpath;
+
+- push @target,
++ push @target,
+ '$(FULLPERL) -I$(INST_LIB) ' .
+ "-I$apache_test_dir -MModPerl::BuildMM " .
+ "-e ModPerl::BuildMM::glue_pod $pm $podpath $blib";
+Index: lib/ModPerl/Code.pm
+===================================================================
+--- lib/ModPerl/Code.pm (.../tags/2_0_3) (revision 630610)
++++ lib/ModPerl/Code.pm (.../trunk) (revision 630610)
+@@ -68,7 +68,7 @@
+ },
+ PerSrv => {
+ ret => 'int',
+- args => [{type => 'request_rec', name => 'r'},
++ args => [{type => 'request_rec', name => 'r'},
+ {type => 'dummy', name => 'MP_HOOK_RUN_ALL'}],
+ },
+ Connection => {
+@@ -140,7 +140,7 @@
+ Srv => ['NONE', @ithread_opts, qw(ENABLE AUTOLOAD MERGE_HANDLERS),
+ @hook_flags, 'UNSET','INHERIT_SWITCHES'],
+ Dir => [qw(NONE PARSE_HEADERS SETUP_ENV MERGE_HANDLERS GLOBAL_REQUEST UNSET)],
+- Req => [qw(NONE SET_GLOBAL_REQUEST PARSE_HEADERS SETUP_ENV
++ Req => [qw(NONE SET_GLOBAL_REQUEST PARSE_HEADERS SETUP_ENV
+ CLEANUP_REGISTERED PERL_SET_ENV_DIR PERL_SET_ENV_SRV)],
+ Interp => [qw(NONE IN_USE PUTBACK CLONED BASE)],
+ Handler => [qw(NONE PARSED METHOD OBJECT ANON AUTOLOAD DYNAMIC FAKE)],
+@@ -379,7 +379,7 @@
+ "$h_name is disabled for server ",
+ parms->server->server_hostname, NULL);
+ }
+- MP_TRACE_d(MP_FUNC, "push \@%s, %s\\n", parms->cmd->name, arg);
++ MP_TRACE_d(MP_FUNC, "push \@%s, %s", parms->cmd->name, arg);
+ return $cmd_push(&($av), arg, parms->pool);
+ }
+ EOF
+@@ -451,7 +451,7 @@
+ for (keys %lookup) {
+ if (/^(\w)/) {
+ my $gap = " " x ($max_len - length $_);
+- push @{ $switch{$1} },
++ push @{ $switch{$1} },
+ qq{if (strEQ(str, "$_"))$gap return $lookup{$_};};
+ }
+ }
+@@ -468,7 +468,7 @@
+ }
+
+ delete $dumper{None}; #NONE
+- print $h_fh join ' \\'."\n",
++ print $h_fh join ' \\'."\n",
+ "#define ${class}_dump_flags(p, str)",
+ qq{modperl_trace(NULL, "$class flags dump (%s):", str);},
+ map $dumper{$_}, sort keys %dumper;
+@@ -552,7 +552,7 @@
+ $i += $i;
+ }
+
+- print $h_fh join ' \\'."\n",
++ print $h_fh join ' \\'."\n",
+ '#define MP_TRACE_dump_flags()',
+ qq{modperl_trace(NULL, "mod_perl trace flags dump:");},
+ @dumper;
+@@ -785,7 +785,7 @@
+ # Fix this by cleaning the @Extensions array.
+
+ # Loads @Extensions if not loaded
+- ExtUtils::Embed::static_ext();
++ ExtUtils::Embed::static_ext();
+
+ @ExtUtils::Embed::Extensions = grep{$_} @ExtUtils::Embed::Extensions;
+
+@@ -820,9 +820,9 @@
+
+ #backwards compat with older httpd/apr
+ #XXX: remove once we require newer httpd/apr
+-my %ifdef = map { $_, 1 }
++my %ifdef = map { $_, 1 }
+ qw(APLOG_TOCLIENT APR_LIMIT_NOFILE), # added in ???
+- qw(AP_MPMQ_STARTING AP_MPMQ_RUNNING AP_MPMQ_STOPPING
++ qw(AP_MPMQ_STARTING AP_MPMQ_RUNNING AP_MPMQ_STOPPING
+ AP_MPMQ_MPM_STATE), # added in 2.0.49
+ qw(APR_FPROT_USETID APR_FPROT_GSETID
+ APR_FPROT_WSTICKY APR_FOPEN_LARGEFILE); # added in 2.0.50?
+@@ -887,7 +887,7 @@
+ if (strEQ(name, "$name")) {
+ EOF
+
+- if ($name eq 'DECLINE_CMD' ||
++ if ($name eq 'DECLINE_CMD' ||
+ $name eq 'DIR_MAGIC_TYPE' ||
+ $name eq 'CRLF') {
+ print $c_fh <<EOF;
+@@ -941,9 +941,9 @@
+
+ $class = canon_lc(lc $class);
+ while (my ($group, $constants) = each %$groups) {
+- push @tags, $group;
++ push @tags, $group;
+ my $name = join '_', 'MP_constants', $class, $group;
+- print $c_fh "\nstatic const char *$name [] = { \n",
++ print $c_fh "\nstatic const char *$name [] = { \n",
+ (map {
+ my @ifdef = constants_ifdef($_);
+ s/^($constant_prefixes)_?//o;
+@@ -965,12 +965,12 @@
+ print $c_fh "\n$proto\n{\n", " switch (*name) {\n";
+
+ for my $key (sort keys %switch) {
+- my $val = $switch{$key};
+- print $c_fh "\tcase '$key':\n";
+- for my $group (@$val) {
++ my $val = $switch{$key};
++ print $c_fh "\tcase '$key':\n";
++ for my $group (@$val) {
+ my $name = join '_', 'MP_constants', $class, $group;
+- print $c_fh qq|\tif(strEQ("$group", name))\n\t return $name;\n|;
+- }
++ print $c_fh qq|\tif(strEQ("$group", name))\n\t return $name;\n|;
++ }
+ print $c_fh " break;\n";
+ }
+
+Index: lib/ModPerl/TestReport.pm
+===================================================================
+--- lib/ModPerl/TestReport.pm (.../tags/2_0_3) (revision 630610)
++++ lib/ModPerl/TestReport.pm (.../trunk) (revision 630610)
+@@ -65,7 +65,7 @@
+ my @lines = "*** Packages of interest status:\n";
+
+ for my $package (sort @interesting_packages) {
+- my $vers = exists $packages{$package}
++ my $vers = exists $packages{$package}
+ ? join ", ", sort @{ $packages{$package} }
+ : "-";
+ push @lines, sprintf "%-${max_len}s: %s", $package, $vers;
+Index: lib/ModPerl/TypeMap.pm
+===================================================================
+--- lib/ModPerl/TypeMap.pm (.../tags/2_0_3) (revision 630610)
++++ lib/ModPerl/TypeMap.pm (.../trunk) (revision 630610)
+@@ -245,7 +245,7 @@
+
+ $self->thx_fixup($func);
+
+- my ($status, $failed_type) =
++ my ($status, $failed_type) =
+ $self->can_map($map, $func->{return_type},
+ map $_->{type}, @{ $func->{args} });
+
+@@ -413,6 +413,7 @@
+ apr_lib.h
+ apr_general.h
+ apr_signal.h
++apr_thread_rwlock.h
+ util_script.h
+ };
+
+Index: lib/Apache2/Reload.pm
+===================================================================
+--- lib/Apache2/Reload.pm (.../tags/2_0_3) (revision 630610)
++++ lib/Apache2/Reload.pm (.../trunk) (revision 630610)
+@@ -1,185 +0,0 @@
+-# Licensed to the Apache Software Foundation (ASF) under one or more
+-# contributor license agreements. See the NOTICE file distributed with
+-# this work for additional information regarding copyright ownership.
+-# The ASF licenses this file to You under the Apache License, Version 2.0
+-# (the "License"); you may not use this file except in compliance with
+-# the License. You may obtain a copy of the License at
+-#
+-# http://www.apache.org/licenses/LICENSE-2.0
+-#
+-# Unless required by applicable law or agreed to in writing, software
+-# distributed under the License is distributed on an "AS IS" BASIS,
+-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-# See the License for the specific language governing permissions and
+-# limitations under the License.
+-#
+-package Apache2::Reload;
+-
+-use strict;
+-use warnings FATAL => 'all';
+-
+-use mod_perl2;
+-
+-our $VERSION = '0.09';
+-
+-use Apache2::Const -compile => qw(OK);
+-
+-use Apache2::Connection;
+-use Apache2::ServerUtil;
+-use Apache2::RequestUtil;
+-
+-use ModPerl::Util ();
+-
+-use vars qw(%INCS %Stat $TouchTime);
+-
+-%Stat = ($INC{"Apache2/Reload.pm"} => time);
+-
+-$TouchTime = time;
+-
+-sub import {
+- my $class = shift;
+- my ($package, $file) = (caller)[0,1];
+-
+- $class->register_module($package, $file);
+-}
+-
+-sub package_to_module {
+- my $package = shift;
+- $package =~ s/::/\//g;
+- $package .= ".pm";
+- return $package;
+-}
+-
+-sub module_to_package {
+- my $module = shift;
+- $module =~ s/\//::/g;
+- $module =~ s/\.pm$//g;
+- return $module;
+-}
+-
+-sub register_module {
+- my ($class, $package, $file) = @_;
+- my $module = package_to_module($package);
+-
+- if ($file) {
+- $INCS{$module} = $file;
+- }
+- else {
+- $file = $INC{$module};
+- return unless $file;
+- $INCS{$module} = $file;
+- }
+-}
+-
+-sub unregister_module {
+- my ($class, $package) = @_;
+- my $module = package_to_module($package);
+- delete $INCS{$module};
+-}
+-
+-# the first argument is:
+-# $c if invoked as 'PerlPreConnectionHandler'
+-# $r if invoked as 'PerlInitHandler'
+-sub handler {
+- my $o = shift;
+- $o = $o->base_server if ref($o) eq 'Apache2::Connection';
+-
+- my $DEBUG = ref($o) && (lc($o->dir_config("ReloadDebug") || '') eq 'on');
+-
+- my $TouchFile = ref($o) && $o->dir_config("ReloadTouchFile");
+-
+- my $ConstantRedefineWarnings = ref($o) &&
+- (lc($o->dir_config("ReloadConstantRedefineWarnings") || '') eq 'off')
+- ? 0 : 1;
+-
+- my $TouchModules;
+-
+- if ($TouchFile) {
+- warn "Checking mtime of $TouchFile\n" if $DEBUG;
+- my $touch_mtime = (stat $TouchFile)[9] || return Apache2::Const::OK;
+- return Apache2::Const::OK unless $touch_mtime > $TouchTime;
+- $TouchTime = $touch_mtime;
+- open my $fh, $TouchFile or die "Can't open '$TouchFile': $!";
+- $TouchModules = <$fh>;
+- chomp $TouchModules if $TouchModules;
+- }
+-
+- if (ref($o) && (lc($o->dir_config("ReloadAll") || 'on') eq 'on')) {
+- *Apache2::Reload::INCS = \%INC;
+- }
+- else {
+- *Apache2::Reload::INCS = \%INCS;
+- my $ExtraList =
+- $TouchModules ||
+- (ref($o) && $o->dir_config("ReloadModules")) ||
+- '';
+- my @extra = split /\s+/, $ExtraList;
+- foreach (@extra) {
+- if (/(.*)::\*$/) {
+- my $prefix = $1;
+- $prefix =~ s/::/\//g;
+- foreach my $match (keys %INC) {
+- if ($match =~ /^\Q$prefix\E/) {
+- $Apache2::Reload::INCS{$match} = $INC{$match};
+- }
+- }
+- }
+- else {
+- Apache2::Reload->register_module($_);
+- }
+- }
+- }
+-
+- my $ReloadDirs = ref($o) && $o->dir_config("ReloadDirectories");
+- my @watch_dirs = split(/\s+/, $ReloadDirs||'');
+-
+- my @changed;
+- foreach my $key (sort { $a cmp $b } keys %Apache2::Reload::INCS) {
+- my $file = $Apache2::Reload::INCS{$key};
+-
+- next unless defined $file;
+- next if @watch_dirs && !grep { $file =~ /^$_/ } @watch_dirs;
+- warn "Apache2::Reload: Checking mtime of $key\n" if $DEBUG;
+-
+- my $mtime = (stat $file)[9];
+-
+- unless (defined($mtime) && $mtime) {
+- for (@INC) {
+- $mtime = (stat "$_/$file")[9];
+- last if defined($mtime) && $mtime;
+- }
+- }
+-
+- warn("Apache2::Reload: Can't locate $file\n"), next
+- unless defined $mtime and $mtime;
+-
+- unless (defined $Stat{$file}) {
+- $Stat{$file} = $^T;
+- }
+-
+- if ($mtime > $Stat{$file}) {
+- push @changed, $key;
+- }
+- $Stat{$file} = $mtime;
+- }
+-
+- #First, let's unload all changed modules
+- foreach my $module (@changed) {
+- my $package = module_to_package($module);
+- ModPerl::Util::unload_package($package);
+- }
+-
+- #Then, let's reload them all, so that module dependencies can satisfy
+- #themselves in the correct order.
+- foreach my $module (@changed) {
+- my $package = module_to_package($module);
+- require $module;
+- warn("Apache2::Reload: process $$ reloading $package from $module\n")
+- if $DEBUG;
+- }
+-
+- return Apache2::Const::OK;
+-}
+-
+-1;
+-__END__
+Index: lib/Apache2/SizeLimit.pm
+===================================================================
+--- lib/Apache2/SizeLimit.pm (.../tags/2_0_3) (revision 630610)
++++ lib/Apache2/SizeLimit.pm (.../trunk) (revision 630610)
+@@ -80,7 +80,7 @@
+ # Currently unsupported for mp2 because of threads...
+ # }
+ # elsif (WIN32) {
+-#
++#
+ # if ( eval { require Win32::API } ) {
+ # $HOW_BIG_IS_IT = \&win32_size_check;
+ # }
+@@ -142,7 +142,7 @@
+ # rss is in KB but ixrss is in BYTES.
+ # This is true on at least FreeBSD, OpenBSD, NetBSD
+ # Philip M. Gollucci
+-sub _bsd_size_check {
++sub bsd_size_check {
+
+ my @results = BSD::Resource::getrusage();
+ my $max_rss = $results[2];
+Index: lib/Apache2/PerlSections.pm
+===================================================================
+--- lib/Apache2/PerlSections.pm (.../tags/2_0_3) (revision 630610)
++++ lib/Apache2/PerlSections.pm (.../trunk) (revision 630610)
+@@ -66,9 +66,9 @@
+ {
+ no strict 'refs';
+ foreach my $package ($self->package) {
+- my @config = map { split /\n/ }
+- grep { defined }
+- (@{"${package}::$special"},
++ my @config = map { split /\n/ }
++ grep { defined }
++ (@{"${package}::$special"},
+ ${"${package}::$special"});
+ $self->dump_special(@config);
+ }
+@@ -79,6 +79,8 @@
+ Apache2::Const::OK;
+ }
+
++my %directives_seen_hack;
++
+ sub symdump {
+ my ($self) = @_;
+
+@@ -87,7 +89,7 @@
+
+ $self->{symbols} = [];
+
+- #XXX: Here would be a good place to warn about NOT using
++ #XXX: Here would be a good place to warn about NOT using
+ # Apache2::ReadConfig:: directly in <Perl> sections
+ foreach my $pack ($self->package, $self->SPECIAL_PACKAGE) {
+ #XXX: Shamelessly borrowed from Devel::Symdump;
+@@ -95,11 +97,14 @@
+ #We don't want to pick up stashes...
+ next if ($key =~ /::$/);
+ local (*ENTRY) = $val;
+- if (defined $val && defined *ENTRY{SCALAR}) {
++ if (defined $val && defined *ENTRY{SCALAR} && defined $ENTRY) {
+ push @{$self->{symbols}}, [$key, $ENTRY];
+ }
+ if (defined $val && defined *ENTRY{ARRAY}) {
+- push @{$self->{symbols}}, [$key, \@ENTRY];
++ unless (exists $directives_seen_hack{"$key$val"}) {
++ $directives_seen_hack{"$key$val"} = 1;
++ push @{$self->{symbols}}, [$key, \@ENTRY];
++ }
+ }
+ if (defined $val && defined *ENTRY{HASH} && $key !~ /::/) {
+ push @{$self->{symbols}}, [$key, \%ENTRY];
+Index: lib/Apache2/ParseSource.pm
+===================================================================
+--- lib/Apache2/ParseSource.pm (.../tags/2_0_3) (revision 630610)
++++ lib/Apache2/ParseSource.pm (.../trunk) (revision 630610)
+@@ -79,7 +79,7 @@
+
+
+ # some types c-scan failing to resolve
+-push @c_scan_defines, map { "$_=void" }
++push @c_scan_defines, map { "$_=void" }
+ qw(PPADDR_t PerlExitListEntry modperl_tipool_vtbl_t);
+
+ sub scan {
+Index: lib/Apache2/Build.pm
+===================================================================
+--- lib/Apache2/Build.pm (.../tags/2_0_3) (revision 630610)
++++ lib/Apache2/Build.pm (.../trunk) (revision 630610)
+@@ -1592,7 +1592,10 @@
+ return $self->dynamic_link_header_default .
+ "\t$defs" .
+ ($symbols ? ' \\' . "\n\t-pdb:$symbols" : '') .
+- ' -out:$@' . "\n\n";
++ ' -out:$@' . "\n\t" .
++ 'if exist $(MODPERL_MANIFEST_LOCATION)' . " \\\n\t" .
++ 'mt /nologo /manifest $(MODPERL_MANIFEST_LOCATION)' . " \\\n\t" .
++ '/outputresource:$@;2' . "\n\n";
+ }
+
+ sub dynamic_link_aix {
+@@ -1838,6 +1841,12 @@
+ if ($self->is_dynamic && (my $libs = $self->modperl_libpath)) {
+ print $fh $self->canon_make_attr('lib_location', $libs);
+
++ # Visual Studio 8 on Win32 uses manifest files
++ if (WIN32) {
++ (my $manifest = $libs) =~ s/\.lib$/.so.manifest/;
++ print $fh $self->canon_make_attr('manifest_location', $manifest);
++ }
++
+ print $fh $self->canon_make_attr('ap_libdir',
+ $self->ap_destdir(catdir $self->{MP_AP_PREFIX}, 'lib')
+ );
+@@ -1938,7 +1947,7 @@
+ clean:
+ $(MODPERL_RM_F) *.a *.so *.xsc \
+ $(MODPERL_LIBNAME).exp $(MODPERL_LIBNAME).lib \
+- *$(MODPERL_OBJ_EXT) *.lo *.i *.s *.pdb \
++ *$(MODPERL_OBJ_EXT) *.lo *.i *.s *.pdb *.manifest \
+ $(MODPERL_CLEAN_FILES) \
+ $(MODPERL_XS_CLEAN_FILES)
+
+Index: lib/Apache2/porting.pm
+===================================================================
+--- lib/Apache2/porting.pm (.../tags/2_0_3) (revision 630610)
++++ lib/Apache2/porting.pm (.../trunk) (revision 630610)
+@@ -32,7 +32,7 @@
+ # - removed and replaced methods
+ # - hinting the package names in which methods reside
+
+-my %avail_methods = map { $_ => 1 }
++my %avail_methods = map { $_ => 1 }
+ (ModPerl::MethodLookup::avail_methods(),
+ ModPerl::MethodLookup::avail_methods_compat());
+
+Index: lib/Apache2/Status.pm
+===================================================================
+--- lib/Apache2/Status.pm (.../tags/2_0_3) (revision 630610)
++++ lib/Apache2/Status.pm (.../trunk) (revision 630610)
+@@ -60,8 +60,8 @@
+ lexinfo => ["StatusLexInfo", "B::LexInfo", 0, ],
+ xref => ["StatusXref", "B::Xref", 1.01, ],
+ terse => ["StatusTerse", "B::Terse", 0, ],
+- tersesize => ["StatusTerseSize", "B::TerseSize", 0.07, ],
+- packagesize => ["StatusPackageSize", "B::TerseSize", 0.07, ],
++ tersesize => ["StatusTerseSize", "B::TerseSize", 0.09, ],
++ packagesize => ["StatusPackageSize", "B::TerseSize", 0.09, ],
+ peek => ["StatusPeek", "Apache::Peek", 1.03, ],
+ );
+
+@@ -201,7 +201,7 @@
+ my $uri = $r->uri;
+ my @retval = (
+ '<table border="1">',
+- "<tr>",
++ "<tr>",
+ (map "<td><b>$_</b></td>", qw(Package Version Modified File)),
+ "</tr>\n"
+ );
+@@ -221,8 +221,8 @@
+ 'N/A';
+
+ push @retval, (
+- "<tr>",
+- (map "<td>$_</td>",
++ "<tr>",
++ (map "<td>$_</td>",
+ qq(<a href="$uri?$module">$module</a>),
+ $v, $mtime, $INC{$file}),
+ "</tr>\n"
+@@ -243,7 +243,7 @@
+
+ foreach my $file (sort keys %INC) {
+ next if $file =~ m:\.(pm|al|ix)$:;
+- push @retval,
++ push @retval,
+ qq(<tr><td>$file</td><td>$INC{$file}</td></tr>\n);
+ }
+ push @retval, "</table>";
+@@ -394,14 +394,14 @@
+ $obj->can('FILEGV') ? $obj->FILEGV->SV->PV : $obj->FILE;
+ }
+
+-sub status_cv_dump {
++sub status_cv_dump {
+ my ($r) = @_;
+ return [] unless has($r, "b");
+
+ no strict 'refs';
+ my ($name, $type) = (split "/", $r->uri)[-2,-1];
+ # could be another child, which doesn't have this symbol table?
+- return unless *$name{CODE};
++ return unless *$name{CODE};
+
+ my @retval = "<p>Subroutine info for <b>$name</b></p>\n<pre>\n";
+ my $obj = B::svref_2object(*$name{CODE});
+@@ -409,7 +409,7 @@
+ my $stash = $obj->GV->STASH->NAME;
+ my $script = $r->location;
+
+- push @retval, "File: ",
++ push @retval, "File: ",
+ (-e $file ? qq(<a href="file:$file">$file</a>) : $file), "\n";
+
+ my $cv = $obj->GV->CV;
+@@ -563,11 +563,11 @@
+ }
+ elsif ($name =~ /^\*(\w+)\{(\w+)\}/) {
+ my $link = qq(<a href="$script/$package\::$1/$2?data_dump">);
+- $r->printf("$link%-${nlen}s</a> %${slen}d bytes\n",
++ $r->printf("$link%-${nlen}s</a> %${slen}d bytes\n",
+ $name, $stats->{size});
+ }
+ else {
+- my $link =
++ my $link =
+ qq(<a href="$script/slow/$package\::$name?noh_b_terse_size">);
+ $r->printf("$link%-${nlen}s</a> %${slen}d bytes | %${clen}d OPs\n",
+ $name, $stats->{size}, $stats->{count});
+@@ -592,7 +592,7 @@
+
+ my $name = (split "/", $r->uri)[-1];
+ $r->print("Deparse of $name\n\n");
+- my $deparse = B::Deparse->new(split /\s+/,
++ my $deparse = B::Deparse->new(split /\s+/,
+ $r->dir_config('StatusDeparseOptions')||"");
+ my $body = $deparse->coderef2text(\&{$name});
+ $r->print("sub $name $body");
+@@ -615,7 +615,7 @@
+
+ my $name = (split "/", $r->uri)[-1];
+ $r->print("Fathom Score of $name\n\n");
+- my $fathom = B::Fathom->new(split /\s+/,
++ my $fathom = B::Fathom->new(split /\s+/,
+ $r->dir_config('StatusFathomOptions')||"");
+ $r->print($fathom->fathom(\&{$name}));
+ }
+@@ -772,7 +772,7 @@
+
+ my @methods = sort keys %{$self->{'AUTOLOAD'}};
+
+- if ($is_main) {
++ if ($is_main) {
+ @methods = grep { $_ ne "packages" } @methods;
+ unshift @methods, "packages";
+ }
+@@ -783,7 +783,7 @@
+ my @line = ();
+
+ for (sort $self->_partdump(uc $type)) {
+- s/([\000-\037\177])/ '^' . pack('c', ord($1) ^ 64)/eg;
++ s/([\000-\037\177])/ '^' . pack('c', ord($1) ^ 64)/eg;
+
+ if ($type eq "scalars") {
+ no strict 'refs';
+Index: lib/Apache2/compat.pm
+===================================================================
+--- lib/Apache2/compat.pm (.../tags/2_0_3) (revision 630610)
++++ lib/Apache2/compat.pm (.../trunk) (revision 630610)
+@@ -310,7 +310,7 @@
+
+ package Apache::Server;
+ # XXX: is that good enough? see modperl/src/modules/perl/mod_perl.c:367
+-our $CWD = Apache2::ServerUtil::server_root;
++our $CWD = Apache2::ServerUtil::server_root();
+
+ our $AddPerlVersion = 1;
+
+@@ -321,6 +321,10 @@
+
+ package Apache;
+
++sub request {
++ return Apache2::compat::request(@_);
++}
++
+ sub unescape_url_info {
+ my ($class, $string) = @_;
+ Apache2::URI::unescape_url($string);
+@@ -344,7 +348,7 @@
+ return File::Spec->catfile(@_);
+ }
+ else {
+- File::Spec->catfile(Apache2::ServerUtil::server_root, @_);
++ File::Spec->catfile(Apache2::ServerUtil::server_root(), @_);
+ }
+ }
+
+@@ -486,18 +490,18 @@
+ my ($key, $value) = @_;
+
+ if (1 == @_) {
+- return wantarray()
++ return wantarray()
+ ? ($table->get($key))
+ : scalar($table->get($key));
+ }
+ elsif (2 == @_) {
+ if (defined $value) {
+- return wantarray()
++ return wantarray()
+ ? ($table->set($key, $value))
+ : scalar($table->set($key, $value));
+ }
+ else {
+- return wantarray()
++ return wantarray()
+ ? ($table->unset($key))
+ : scalar($table->unset($key));
+ }
+@@ -513,21 +517,21 @@
+
+ sub header_out {
+ my $r = shift;
+- return wantarray()
++ return wantarray()
+ ? ($r->table_get_set(scalar($r->headers_out), @_))
+ : scalar($r->table_get_set(scalar($r->headers_out), @_));
+ }
+
+ sub header_in {
+ my $r = shift;
+- return wantarray()
++ return wantarray()
+ ? ($r->table_get_set(scalar($r->headers_in), @_))
+ : scalar($r->table_get_set(scalar($r->headers_in), @_));
+ }
+
+ sub err_header_out {
+ my $r = shift;
+- return wantarray()
++ return wantarray()
+ ? ($r->table_get_set(scalar($r->err_headers_out), @_))
+ : scalar($r->table_get_set(scalar($r->err_headers_out), @_));
+ }
+@@ -596,7 +600,7 @@
+
+ sub server_root_relative {
+ my $r = shift;
+- File::Spec->catfile(Apache2::ServerUtil::server_root, @_);
++ File::Spec->catfile(Apache2::ServerUtil::server_root(), @_);
+ }
+
+ sub clear_rgy_endav {
+Index: lib/mod_perl2.pm
+===================================================================
+--- lib/mod_perl2.pm (.../tags/2_0_3) (revision 630610)
++++ lib/mod_perl2.pm (.../trunk) (revision 630610)
+@@ -19,7 +19,7 @@
+ use strict;
+
+ BEGIN {
+- our $VERSION = "2.000003";
++ our $VERSION = "2.000004";
+ our $VERSION_TRIPLET;
+
+ if ($VERSION =~ /(\d+)\.(\d\d\d)(\d+)/) {
+Index: ModPerl-Registry/t/conf/modperl_extra_startup.pl
+===================================================================
+--- ModPerl-Registry/t/conf/modperl_extra_startup.pl (.../tags/2_0_3) (revision 630610)
++++ ModPerl-Registry/t/conf/modperl_extra_startup.pl (.../trunk) (revision 630610)
+@@ -31,7 +31,7 @@
+ # test the scripts pre-loading by using trans sub
+ {
+ sub trans {
+- my $uri = shift;
++ my $uri = shift;
+ $uri =~ s|^/registry_bb/|cgi-bin/|;
+ return Apache2::ServerUtil::server_root_relative($pool, $uri);
+ }
+Index: ModPerl-Registry/t/conf/extra.conf.in
+===================================================================
+--- ModPerl-Registry/t/conf/extra.conf.in (.../tags/2_0_3) (revision 630610)
++++ ModPerl-Registry/t/conf/extra.conf.in (.../trunk) (revision 630610)
+@@ -21,12 +21,6 @@
+ # run on startup
+ PerlRequire @ServerRoot@/conf/modperl_extra_startup.pl
+
+-#### DEVMODE: Remove in production ###
+-PerlModule Apache2::Reload
+-PerlInitHandler Apache2::Reload
+-PerlSetVar ReloadAll Off
+-PerlSetVar ReloadModules "ModPerl::*"
+-
+ PerlSetVar ModPerl::RegistryCooker::DEBUG 2
+
+ PerlModule ModPerl::RegistryCooker
+@@ -45,6 +39,7 @@
+ Alias /perlrun_prefork/ @ServerRoot@/cgi-bin/
+ Alias /nph/ @ServerRoot@/cgi-bin/
+ Alias /registry_modperl_handler/ @ServerRoot@/cgi-bin/
++ Alias /rewrite_env/ @ServerRoot@/cgi-bin/
+
+ ScriptAlias /cgi-bin/ @ServerRoot@/cgi-bin/
+ </IfModule>
+@@ -220,3 +215,19 @@
+ # </sandbox-friendly>
+
+
++<IfModule mod_rewrite.c>
++
++ RewriteEngine On
++ RewriteLogLevel 9
++ RewriteLog @ServerRoot@/logs/rewrite_log
++ RewriteRule /rewritetest /rewrite_env/env_val.pl?REWRITE_TEST [E=REWRITE_TEST:GOTCHA,PT,NS,L]
++
++ <Location /rewrite_env>
++ SetHandler perl-script
++ PerlResponseHandler ModPerl::Registry
++ Options +ExecCGI
++ PerlOptions +ParseHeaders
++ </Location>
++</IfModule>
++
++
+Index: ModPerl-Registry/t/rewrite_env.t
+===================================================================
+--- ModPerl-Registry/t/rewrite_env.t (.../tags/2_0_3) (revision 0)
++++ ModPerl-Registry/t/rewrite_env.t (.../trunk) (revision 630610)
+@@ -0,0 +1,17 @@
++use strict;
++use warnings FATAL => 'all';
++
++use Apache::Test;
++use Apache::TestUtil;
++use Apache::TestRequest qw(GET);
++
++plan tests => 1, need [qw(mod_alias.c mod_rewrite.c)];
++
++{
++ my $url = "/rewritetest";
++ my $res = GET $url;
++
++ ok t_cmp($res->content(),
++ "GOTCHA",
++ 'found environment variable from mod_rewrite');
++}
+Index: ModPerl-Registry/t/cgi-bin/env_val.pl
+===================================================================
+--- ModPerl-Registry/t/cgi-bin/env_val.pl (.../tags/2_0_3) (revision 0)
++++ ModPerl-Registry/t/cgi-bin/env_val.pl (.../trunk) (revision 630610)
+@@ -0,0 +1,7 @@
++# test env vars
++
++print "Content-type: text/plain\n\n";
++my $var = $ENV{QUERY_STRING};
++print exists $ENV{$var} && $ENV{$var};
++
++__END__
+
+Property changes on: ModPerl-Registry/t/cgi-bin/env_val.pl
+___________________________________________________________________
+Name: svn:executable
+ + *
+
+Index: ModPerl-Registry/t/cgi-bin/perlrun_extload.pl
+===================================================================
+--- ModPerl-Registry/t/cgi-bin/perlrun_extload.pl (.../tags/2_0_3) (revision 630610)
++++ ModPerl-Registry/t/cgi-bin/perlrun_extload.pl (.../trunk) (revision 630610)
+@@ -19,7 +19,7 @@
+ # original function's prototype doesn't match the aliases prototype.
+ # see decl_proto()
+ BEGIN { t_server_log_warn_is_expected()
+- if perlrun_decl->can("decl_proto");
++ if perlrun_decl->can("decl_proto");
+ }
+ use perlrun_decl;
+
+Index: ModPerl-Registry/t/regex.t
+===================================================================
+--- ModPerl-Registry/t/regex.t (.../tags/2_0_3) (revision 0)
++++ ModPerl-Registry/t/regex.t (.../trunk) (revision 630610)
+@@ -0,0 +1,33 @@
++use strict;
++use warnings FATAL => 'all';
++
++use Apache::Test;
++use Apache::TestUtil qw(t_cmp t_catfile_apache);
++use Apache::TestRequest;
++use Apache::TestConfig ();
++
++my %modules = (
++ registry => 'ModPerl::Registry',
++ registry_bb => 'ModPerl::RegistryBB',
++ perlrun => 'ModPerl::PerlRun',
++);
++
++my @aliases = sort keys %modules;
++
++plan tests => @aliases * 1, need 'mod_alias.c';
++
++my $vars = Apache::Test::config()->{vars};
++my $script_file = t_catfile_apache $vars->{serverroot}, 'cgi-bin', 'basic.pl';
++
++# extended regex quoting
++# CVE-2007-1349 (which doesn't affect any of our shipped handlers)
++
++for my $alias (@aliases) {
++ my $url = "/$alias/basic.pl/(";
++
++ ok t_cmp(
++ GET_BODY($url),
++ "ok $script_file",
++ "$modules{$alias} regex in path_info",
++ );
++}
+Index: ModPerl-Registry/lib/ModPerl/RegistryCooker.pm
+===================================================================
+--- ModPerl-Registry/lib/ModPerl/RegistryCooker.pm (.../tags/2_0_3) (revision 630610)
++++ ModPerl-Registry/lib/ModPerl/RegistryCooker.pm (.../trunk) (revision 630610)
+@@ -326,7 +326,7 @@
+ sub namespace_from_filename {
+ my $self = shift;
+
+- my ($volume, $dirs, $file) =
++ my ($volume, $dirs, $file) =
+ File::Spec::Functions::splitpath($self->{FILENAME});
+ my @dirs = File::Spec::Functions::splitdir($dirs);
+ return join '_', grep { defined && length } $volume, @dirs, $file;
+@@ -337,11 +337,11 @@
+ my $self = shift;
+
+ my $path_info = $self->{REQ}->path_info;
+- my $script_name = $path_info && $self->{URI} =~ /$path_info$/
++ my $script_name = $path_info && $self->{URI} =~ /\Q$path_info\E$/
+ ? substr($self->{URI}, 0, length($self->{URI}) - length($path_info))
+ : $self->{URI};
+
+- if ($ModPerl::RegistryCooker::NameWithVirtualHost &&
++ if ($ModPerl::RegistryCooker::NameWithVirtualHost &&
+ $self->{REQ}->server->is_virtual) {
+ my $name = $self->{REQ}->get_server_name;
+ $script_name = join "", $name, $script_name if $name;
+@@ -486,7 +486,7 @@
+ sub should_compile_if_modified {
+ my $self = shift;
+ $self->{MTIME} ||= -M $self->{REQ}->my_finfo;
+- !($self->is_cached &&
++ !($self->is_cached &&
+ $self->cache_table->{ $self->{PACKAGE} }{mtime} <= $self->{MTIME});
+ }
+
+@@ -546,9 +546,8 @@
+ return Apache2::Const::FORBIDDEN if APR::Status::is_EACCES($@);
+ return Apache2::Const::NOT_FOUND if APR::Status::is_ENOENT($@);
+ }
+- else {
+- return Apache2::Const::SERVER_ERROR;
+- }
++
++ return Apache2::Const::SERVER_ERROR;
+ }
+
+ return Apache2::Const::OK;
+@@ -611,7 +610,7 @@
+ # dflt: NOP
+ # desc: chdirs into $dir
+ # args: $self - registry blessed object
+-# $dir - a dir
++# $dir - a dir
+ # rtrn: nothing (?or success/failure?)
+ #########################################################################
+
+@@ -671,9 +670,9 @@
+ ModPerl::Global::special_list_clear( END => $self->{PACKAGE});
+
+ {
+- # let the code define its own warn and strict level
++ # let the code define its own warn and strict level
+ no strict;
+- no warnings FATAL => 'all'; # because we use FATAL
++ no warnings FATAL => 'all'; # because we use FATAL
+ eval $$eval;
+ }
+
+Index: Changes
+===================================================================
+--- Changes (.../tags/2_0_3) (revision 630610)
++++ Changes (.../trunk) (revision 630610)
+@@ -10,6 +10,106 @@
+
+ =over 3
+
++=item 2.0.4-dev
++
++Fix $r->location corruption under certain conditions
++[Gozer]
++
++Fix a crash when spawning Perl threads under Perl 5.10
++[Gozer]
++
++Fix erratic behaviour when filters were used with Perl 5.10
++[Gozer]
++
++Fix problems with redefinitions of perl_free as free and perl_malloc
++as malloc on Win32, as described at
++ http://marc.info/?l=apache-modperl&m=119896407510526&w=2
++[Tom Donovan]
++
++Fix a crash when running a sub-request from within a filter where
++mod_perl was not the content handler. [Gozer]
++
++Refactor tests to use keepalives instead of same_interp [Gozer, Phred]
++
++Apache2::Reload has been moved to an externally maintained
++CPAN distribution [Fred Moyer <fred@redhotpenguin.com>]
++
++PerlCleanupHandler are now registered with a subpool of $r->pool,
++instead of $r->pool itself, ensuring they run _before_ any other
++$r->pool cleanups [Torsten Foertsch]
++
++Fix a bug that would prevent pnotes from being cleaned up proprely
++at the end of the request [Torsten Foertsch]
++
++On Win32, embed the manifest file, if present, in mod_perl.so,
++so as to work with VC 8 [Steve Hay, Randy Kobes]
++
++Expose apr_thread_rwlock_t with the APR::ThreadRWLock module
++[Torsten Foertsch]
++
++Don't waste an extra interpreter anymore under threaded MPMs when using a
++modperl handler [Torsten Foertsch]
++
++Fix a bug that could cause a crash when using $r->push_handlers() multiple
++times for a phase that has no configured handlers [Torsten Foertsch]
++
++Catch up with some httpd API changes
++ 2.2.4:
++ The full server version information is now included in the error log at
++startup as well as server status reports, irrespective of the setting
++of the ServerTokens directive. ap_get_server_version() is now
++deprecated, and is replaced by ap_get_server_banner() and
++ap_get_server_description(). [Jeff Trawick]
++
++ 2.3.0:
++ap_get_server_version() has been removed. Third-party modules must
++now use ap_get_server_banner() or ap_get_server_description().
++[Gozer]
++
++fixed Apache2::compat Apache2::ServerUtil::server_root() resolution
++issues [Joshua Hoblitt]
++
++*) SECURITY: CVE-2007-1349 (cve.mitre.org)
++fix unescaped variable interprolation in regular expression
++[Randal L. Schwartz <merlyn@stonehenge.com>, Fred Moyer <fred@redhotpenguin.com>]
++
++Make $r->the_request() writeable
++[Fred Moyer <fred@redhotpenguin.com>]
++
++fix ModPerl::RegistryCooker::read_script to handle all possible
++errors, previously there was a case where Apache2::Const::OK was
++returned on an error. [Eivind Eklund <eeklund@gmail.com>]
++
++a minor compilation warning resolved in modperl_handler_new_from_sv
++[Stas]
++
++a minor compilation warning resolved in modperl_gtop_size_string
++[Stas]
++
++Prevent direct use of _deprecated_ Apache2::ReadConfig in
++<Perl> sections with httpd Alias directives from
++incorrectly generating
++'The Alias directive in xxxxx at line y will probably never match'
++messages.
++[Philip M. Gollucci <pgollucci@p6m78g.com>]
++
++Prevent Apache2::PerSections::symdump() from returning invalid
++httpd.conf snippets like 'Alias undef'
++[Philip M. Gollucci <pgollucci@p6m78g.com>]
++
++Require B-Size 0.9 for Apache2::Status which fixes
++Can't call method "script_name" on an undefined value
++[Philip M. Gollucci <pgollucci@p6m78g.com>]
++
++-march=pentium4 or anything with an = in it in CCFLAGS or @ARGV
++that gets passed to xs/APR/APR/Makefile.PL broke the @ARGV
++parsing. I.E. FreeBSD port builds when users had CPUTYPE
++set in /etc/make.conf.
++[Philip M. Gollucci <pgollucci@p6m7g8.com>]
++
++Fixes to get bleed-ithread (5.9.5+) to comile again.
++[Philip M. Gollucci <pgollucci@p6m7g8.com>]
++
+ =item 2.0.3 November 28, 2006
+
+ Prevent things in %INC that are not stat() able
+
+Property changes on: .
+___________________________________________________________________
+Name: svnmerge-integrated
+ + /perl/modperl/branches/threading:1-584361
+Name: svn:externals
+ - Apache-Test https://svn.apache.org/repos/asf/perl/Apache-Test/tags/1_29
+docs https://svn.apache.org/repos/asf/perl/modperl/docs/tags/2_0_3/src/docs/2.0
+
+ + Apache-Test https://svn.apache.org/repos/asf/perl/Apache-Test/trunk
+docs https://svn.apache.org/repos/asf/perl/modperl/docs/trunk/src/docs/2.0
+
+