http://rt.perl.org/rt3/Ticket/Display.html?id=7112 It still crashes on 5.8.8 but does not on 5.10. Modified version with "local $% = 0;" crashes even 5.10. Error: Attempt to free unreferenced scalar: SV 0x9bb964, Perl interpreter: 0x9a7584 Dec 03 02:20:46 2004, asavige wrote: > Steve Peters wrote: > >> $|= 1; > >> for $var (1..3) > >> { > >> for (1..2) > >> { > >> if ( $pid=fork() ) > >> { > >> print "Parent $$ created child $pid\n" ; > >> sleep 1; > >> waitpid($pid,0); > >> exit 0; > >> } > >> elsif ( ! defined $pid ) > >> { > >> die "Can not go to multi thread mode\n" > >> } > >> else > >> { > >> print "Child $$ running\n"; > >> } > >> } > >> print "\nThread team $var finished\n\n"; > >> } > >> print "Program $$ finished\n"; > > > > I was able to replicate the failure with ActiveState Perl 5.8.4 Build > > 810 on Windows XP. Although I didn't get the nice failure above, it > > did complain loudly in a popup about writing to a null pointer. > > This test program given also crashes the latest Perl 5.8.6. > > I was able to get rid of the crashes by replacing: > for (1..2) > above with: > for my $z (1..2) > For more variety, if you add: > local $% = 0; > as the first statement inside each loop, it not only crashes but > generates some: > Atttempt to free unreferenced scalar > warnings for good measure. > > I'm guessing that a localized built-in variable inside the inner loop > will be freed twice at end of scope: once by the original interpreter > and once by the cloned one. > > I can't think of a way to simulate the above crash on Linux with plain > old ithreads; if you think of a way, please let me know. Maybe the > scenario above is impossible with plain ithreads? -- Alexandr Ciornii, http://chorny.net