On Wed, Nov 6, 2013 at 4:02 AM, Steve Hay <steve.m....@googlemail.com>wrote:
> On 6 November 2013 00:48, Jeff Trawick <traw...@gmail.com> wrote: > > Back to the httpd24threading branch: > > > > * modperl_interp_pool_select() has this notion of phase, which must > either > > be startup or request context. > > * It thinks it is startup only if the pool passed in is > s->process->pconf. > > * Sometimes it is passed s->process->pool (parent of pconf), such as from > > perl_parse_require_line(). > > * perl_parse_require_line() can sometimes be called from request context. > > * When perl_parse_require_line() calls modperl_interp_pool_select(), > request > > context can never be identified because perl_parse_require_line() never > > passes in r->pool (which I guess would be cmd->pool). > > * etc. > > > > This would seem to be the way to get the right pool to > > modperl_interp_pool_select(). > > > > Index: src/modules/perl/modperl_util.c > > =================================================================== > > --- src/modules/perl/modperl_util.c (revision 1539040) > > +++ src/modules/perl/modperl_util.c (working copy) > > @@ -989,7 +989,7 @@ > > int count; > > void *key; > > auth_callback *ab; > > - MP_dINTERP_POOLa(cmd->server->process->pool, cmd->server); > > + MP_dINTERP_POOLa(cmd->pool, cmd->server); > > > > if (global_authz_providers == NULL) { > > MP_INTERP_PUTBACK(interp, aTHX); > > > > That still doesn't bring happiness (no interpreter returned, resulting > in a > > crash trying to dereference interp). > > > > I'm getting the same crash-on-startup behaviour now myself after a > fresh rebuild of everything (now using httpd-2.4.6 and perl-5.19.5). I > will look back over the changes made on the threading branch and/or my > merges of them into the httpd24 branch. Hopefully the answer lies > there somewhere. I'll be very grateful for any help I can get with > this though -- I didn't do the original work on either of those > branches... > With the "fix" above in place, modperl_init_vhost() seems to be the next crucial code. We go down this path: if (base_server == s) { MP_TRACE_i(MP_FUNC, "base server is not vhost, skipping %s", vhost); return OK; } and fall through this FIXME in modperl_interp_pool_select(): if (!scfg->mip) { /* FIXME: We get here if global "server_rec" == s, scfg->mip * is not created then. I'm not sure if that's bug or * bad/good design decicision. For now just return NULL. */ return NULL; } (Note: disabling the base_server == s check in modperl_init_vhost() brings no happiness either, though perhaps it is a step in the right direction.) This path is new with httpd 2.4; 2.2 didn't have authz_providers. This seems to be a whack-a-mole issue. I'd expect that there is some easy way to grab the interpreter for any arbitrary startup path, but I don't see it. Maybe it is worthwhile seeing if we already went through some paths where we were able to grab an interpreter. > (Not sure how you break into things in your debugger, btw. I find the > easiest way is to start up devenv.exe with "devenv /useenv httpd.exe" > and then set the command-line arguments in the httpd project to those > that "t\TEST -start-httpd" would use, namely something like "-d > C:/Dev/Temp/modperl-httpd24threading/t -f > C:/Dev/Temp/modperl-httpd24threading/t/conf/httpd.conf -D APACHE2 -D > PERL_USEITHREADS -D ONE_PROCESS". Then you can just hit F5 etc to set > it running.) > Yeah, that was one of the first things I thought of staring at the ceiling this a.m. Thanks for the shortcut! No need to chase down the -debug code. -- Born in Roswell... married an alien... http://emptyhammock.com/