You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by Sreeji K Das <sr...@yahoo.com> on 2002/02/26 15:04:36 UTC

[BUG?] PerlFreshRestart gives undef. subs (not the one in FAQ !!)

Hi All,
I had been banging my head on this problem for a while
& finally I guess I've found a solution.

Following was the problem:
I had

PerlFreshRestart On
PerlRestartHandler Apache::Symbol

in my conf. I needed the restart func. & didn't want
to use other alternates (like Apache::Reload, StatINC
..etc.). Whenever I did a kill -USR1 I used to get
random 'Undefined subroutine xyz called at..'.
Following seems to be the problem:

mod_perl does something like the following on restart:
while (($k, $v) = each(%INC))
{
 delete($INC{$k}); eval("require $k");
}

Now assume that %INC has keys a.pm, File::Basename in
that order in %INC.
So following is the sequence:
delete a.pm from %INC
require a.pm

Now let's say a.pm does a 'use File::Basename' & then
calls basename($temp) (ie. some func in Basename.pm).
However 'use File::Basename' will not happen, since
perl sees that it exists in %INC (see man perldoc &
the entry of use/require/do). However, the truth is
All functions in File::Basename had been undef'd by
Apache::Symbol (this needs to be done, otherwise I get
a func. redefined for all functions on restart).
So the call basename($temp) fails with a fatal error
'Undefined subroutine File::Basename::basename called
at ...' !!

Since %INC is a hash, each time you'd get a different
'Undefined sub' message. For eg. in the above example,
if File::Basename had come b4 a.pm in %INC, then we
wouldn't have got any errors.

So the work around that I did is to undef %INC after
making a copy. Now perl would load all modules
properly. I went back in time (!) for a while & found
that mod_perl-1.19 implements things correctly.

Attached simple patch corrected my problem. Would some
mod_perl guru do a proper fix (I dunno the internals
much) & release a version ?

BTW, there was another bug in Apache::Symbol. ie. the
following
perl -MDevel::Symdump -e '$t = new Devel::Symdump;
foreach ($t->packages) { print "$_\n"; "'
prints <none> as one of the packages (Only in perl
5.6.1). A work around for the same is also attached.


Hope I've made things clear. I can prepare some test
scripts to demo these problems, if some1 really
requires that.

Thanx
Sreeji

Attached is the patch 


__________________________________________________
Do You Yahoo!?
Everything you'll ever need on one web page
from News and Sport to Email and Music Charts
http://uk.my.yahoo.com