On 6 November 2013 13:50, Steve Hay <steve.m....@googlemail.com> wrote:
> On 6 November 2013 12:27, Jeff Trawick <traw...@gmail.com> wrote:
>> 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.
>>
>
> The last change on the httpd24 branch (r1503193) is what added the
> FIXME above, but it also made a change in perl_parse_require_line()
> which I've lost in the course of merging the threading branch in: it
> made that function tolerant of modperl_interp_pool_select() returning
> NULL (which is exactly what happens in the FIXME case).
>
> If modperl_interp_pool_select() returns NULL then
> perl_parse_require_line() just returns NULL itself in r1503193, but in
> httpd24threading I've hidden the use of modperl_interp_pool_select()
> within the MP_dINTERP_POOLa() macro (as per the general style of
> changes in the threading branch), but that macro crashes if
> modperl_interp_pool_select() has returned NULL.
>
> The diff below makes that macro tolerant of
> modperl_interp_pool_select() returning NULL, and makes
> perl_parse_require_line() tolerant of interp ending up NULL, like it
> used to be in r1503193.
>
> With this diff in place (which includes your earlier change), the
> server now starts up for me and tests appear to be running as normal.

Oops! In my excitement I forgot the diff!:

Index: src/modules/perl/modperl_interp.h
===================================================================
--- src/modules/perl/modperl_interp.h   (revision 1539262)
+++ src/modules/perl/modperl_interp.h   (working copy)
@@ -68,9 +68,12 @@
 #define MP_INTERP_POOLa(p, s)                                           \
     MP_TRACE_i(MP_FUNC, "selecting interp: p=%pp, s=%pp", (p), (s));    \
     interp = modperl_interp_pool_select((p), (s));                      \
-    MP_TRACE_i(MP_FUNC, "  --> got (0x%pp)->refcnt=%d",                 \
-               interp, interp->refcnt);                                 \
-    aTHX = interp->perl
+    if (interp) {                                                       \
+        MP_TRACE_i(MP_FUNC, "  --> got (0x%pp)->refcnt=%d",             \
+                   interp, interp->refcnt);                             \
+        aTHX = interp->perl;                                            \
+    }                                                                   \
+    NOOP

 #define MP_dINTERP_POOLa(p, s)                                          \
     MP_dINTERP;                                                         \
Index: src/modules/perl/modperl_util.c
===================================================================
--- src/modules/perl/modperl_util.c     (revision 1539262)
+++ src/modules/perl/modperl_util.c     (working copy)
@@ -989,8 +989,11 @@
     int count;
     void *key;
     auth_callback *ab;
-    MP_dINTERP_POOLa(cmd->server->process->pool, cmd->server);
+    MP_dINTERP_POOLa(cmd->pool, cmd->server);

+    if (!interp)
+       return ret;
+
     if (global_authz_providers == NULL) {
         MP_INTERP_PUTBACK(interp, aTHX);
         return ret;

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@perl.apache.org
For additional commands, e-mail: dev-h...@perl.apache.org

Reply via email to