Steve Hay wrote:

I now get this in the stderr.txt file:

SV = PV(0x31f64d0) at 0x31960b8
REFCNT = 1
FLAGS = (TEMP,POK,pPOK)
PV = 0x31f7ed4 "ModPerl::Util::exit: (120000) exit was called at C:/apache2/perl5/site/lib/Apache/Test.pm line 238"\0
CUR = 98
LEN = 99
Attempt to free temp prematurely: SV 0x31960b8, Perl interpreter: 0x2b51784 at C:/Temp/bug-reporting-skeleton-mp2/t/response/TestPerl/ithreads.pm line 56.
Scalars leaked: 1

Getting back to the exit function itself called from Apache::Test::plan().

This sv thing shouldn't have really happened. How does exit works in mp2:

void modperl_perl_exit(pTHX_ int status)
{
    ENTER;
    SAVESPTR(PL_diehook);
    PL_diehook = Nullsv;
    modperl_croak(aTHX_ MODPERL_RC_EXIT, "ModPerl::Util::exit");
}

so exit calls modperl_croak(), which creates an APR::Error exception object and throws it via Perl_croak(aTHX_ Nullch);

Now when the handler returns its status goes through modperl_errsv() which has a special case for objects thrown from exit()'s call.

int modperl_errsv(pTHX_ int status, request_rec *r, server_rec *s)
{
    SV *sv = ERRSV;
    STRLEN n_a;

    if (SvTRUE(sv)) {
        if (sv_derived_from(sv, "APR::Error") &&
            SvIVx(sv) == MODPERL_RC_EXIT) {
            /* ModPerl::Util::exit was called */
            return OK;
        }

the actual stringification of the exception object into a string:

"ModPerl::Util::exit: (120000) exit was called at C:/apache2/perl5/site/lib/Apache/Test.pm line 238"\0

happens only if something tries to stringify $@ or bool'ify. But this stringification is done by a perl code in APR::Error, which overloads:

use overload
    nomethod => \&fatal,
    'bool'   => \&str,
    '=='     => \&num,
    '0+'     => \&num,
    '""'     => \&str;

sub str {
    sprintf "%s: (%d) %s at %s line %d", $_[0]->{func},
        $_[0]->{rc}, APR::Error::strerror($_[0]->{rc}),
        $_[0]->{file}, $_[0]->{line};
}

and this is what your SV's PV string looks like. So there is no really any C code here that could get the refcounting wrong.

may be this is something triggered by overload? what happens if you comment out the overload part?

(notice that APR::Error is autogenerated, so you may want to modify
blib/lib/Apache2/APR/Error.pm if you don't want to rebuild things)

alternatively try to add CORE::dump() inside str() above to see who has called the stringification function.

--
__________________________________________________________________
Stas Bekman            JAm_pH ------> Just Another mod_perl Hacker
http://stason.org/     mod_perl Guide ---> http://perl.apache.org
mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org   http://ticketmaster.com

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to