Stas Bekman wrote:
>>I've been walking through things in the debugger, and I've determined
>>that it crashes in ithreads.pm while trying to require threads.pm.
>>
>>I note that ithreads.pm contains this comment:
>>
>> # threads must have been preloaded at the server startup for this
>> # test (this is done at t/conf/modperl_extra.pl)
>> require threads;
>>
>>but the skeleton httpd.conf doesn't do this. I added a "PerlModule
>>threads" line to my extra.conf and tried again, but it didn't fix it :(
>>
>>The full mp2 test suite's actual modperl_extra.pl doesn't seem to
>>contain anything that loads threads either :-s Is something missing
>>here, or is that comment merely bogus?
>>
>>
>
>Right, last night test_perl_ithreads moved to post_config_startup.pl. So
>that note needs to be updated.
>
>
(It still hasn't been.)
>>[...] at this stage threads.dll has not been loaded by Apache.exe, so it
>>is obviously during the loading of that DLL that it crashes.
>>
>>
>
>So do you get any difference if you load it at the server startup, like
>mp2 test suite does?
>
No -- I said (above) adding "PerlModule threads" to extra.conf made no
difference.
I also tried PerlRequire()'ing a script that calls test_perl_ithreads()
to load threads.pm, but that makes no difference either.
Anyway, I've made an interesting new discovery: the ithreads.t test
crashes the server because ithreads.pm contains "use warnings FATAL =>
'all'". Simply commenting-out that line, the skeleton test now succeeds!
The weird thing is that no warnings appear in the error_log. So I added
this instead of the use warnings line:
$SIG{__WARN__} = sub {
open LOG, '>C:\\Temp\\stderr.txt';
print LOG @_;
close LOG;
};
and now I get this written to that log:
Attempt to free temp prematurely: SV 0x2fb241c, Perl interpreter:
0x2fa6014 at
C:/Temp/bug-reporting-skeleton-mp2/t/response/TestPerl/ithreads.pm line 70.
Why didn't that warning make it to the error_log?
Line 70 is the last line of this chunk:
my $thr = threads->new(sub {
my $tid = threads->self->tid;
debug "2nd TID is $tid" if defined $tid;
$counter_priv += $counter_priv for 1..10;
{
lock $counter_shar;
$counter_shar += $counter_shar for 1..10;
}
});
I see from the perl sources that the warning in question is only
generated #ifdef DEBUGGING. Is your perl a DEBUGGING build? If not
then that might be why you don't get this.
Here's the top (bottom?) of the call stack where that warning is emitted:
Perl_sv_free(interpreter * 0x02fa6014, sv * 0x02fb241c) line 5362
Perl_ithread_create(interpreter * 0x0270185c, sv * 0x00000000, char *
0x0154bd2c, sv * 0x02b4977c, sv * 0x02b49794) line 470 + 13 bytes
XS_threads_new(interpreter * 0x0270185c, cv * 0x017308e8) line 681 + 36
bytes
Perl_pp_entersub(interpreter * 0x0270185c) line 2857 + 16 bytes
Perl_runops_debug(interpreter * 0x0270185c) line 1442 + 13 bytes
[...]
Should the interpreter * passed to Perl_sv_free() be different to all
the others in the calls above? Where does Perl_sv_free() even get its
aTHX_ from? SvREFCNT_dec() doesn't pass it one.
There are some comments in perl (5.8.5)'s ext/threads/threads.xs, just
above the SvREFCNT_dec() call (== Perl_sv_free() above) which might be
of some interest?:
/* The code below checks that anything living on
the tmps stack and has been cloned (so it lives in the
ptr_table) has a refcount higher than 0
If the refcount is 0 it means that a something on the
stack/context was holding a reference to it and
since we init_stacks() in perl_clone that won't get
cleaned and we will get a leaked scalar.
The reason it was cloned was that it lived on the
@_ stack.
Example of this can be found in bugreport 15837
where calls in the parameter list end up as a temp
One could argue that this fix should be in perl_clone
*/
- Steve
------------------------------------------------
Radan Computational Ltd.
We would like to take this opportunity to wish all our customers, suppliers and
colleagues seasons greetings. We will not be sending corporate greetings
cards this year. Instead, we will be making a donation to charity.
The information contained in this message and any files transmitted with it are
confidential and intended for the addressee(s) only. If you have received this
message in error or there are any problems, please notify the sender
immediately. The unauthorized use, disclosure, copying or alteration of this
message is strictly forbidden. Note that any views or opinions presented in
this email are solely those of the author and do not necessarily represent
those of Radan Computational Ltd. The recipient(s) of this message should
check it and any attached files for viruses: Radan Computational will accept no
liability for any damage caused by any virus transmitted by this email.