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/

Reply via email to