Hi, While developing with mod_perl and Apache::ASP here at Aduva SID department, we've came across an annoying problem. Apache::ASP adds it's 'Global' directory to @INC. We naturally used it to store modules. Since mod_perl resets @INC across requests but doesn't reset %INC, Apache::StatINC sometimes found changes in the used modules, but couldn't reload them (since their directory wasn't in @INC). This patch will insert missing directories into @INC on the fly. -- Best regards, Ilya Konstantinov
--- StatINC.pm.old Tue Mar 13 18:30:57 2001 +++ StatINC.pm Tue Mar 13 17:30:08 2001 @@ -11,7 +11,7 @@ $r->dir_config("UndefOnReload")) || '') eq "on"); my $DEBUG = ref($r) && (lc($r->dir_config("StatINCDebug") || '') eq "on"); $DEBUG = $r->dir_config("StatINC_Debug") if ref($r) && $r->dir_config("StatINC_Debug"); - + while(my($key,$file) = each %INC) { local $^W = 0; my $mtime = (stat $file)[9]; @@ -20,16 +20,38 @@ unless(defined $Stat{$file}) { $Stat{$file} = $^T; } + # if modified, reload the module if($mtime > $Stat{$file}) { + # make sure file's prefix is in @INC + my $found_in_inc; + for (@INC) { + if(index($file,$_) == 0) { + $found_in_inc = 1; + last; + } + } + + if(!$found_in_inc) { + my $inc_dir = substr($file, 0, length($file)-length($key)-1); + push @INC, $inc_dir; + warn "Apache::StatINC: process $$ adding $inc_dir to \@INC\n" + if $DEBUG > 0; + } + if($do_undef and $key =~ /\.pm$/) { require Apache::Symbol; my $class = Apache::Symbol::file2class($key); $class->Apache::Symbol::undef_functions( undef, 1 ); } delete $INC{$key}; - require $key; - warn "Apache::StatINC: process $$ reloading $key\n" - if $DEBUG > 0; + eval{ require $key }; + if ($@) { + warn "Apache::StatINC: process $$ failed to reload $key. $@" + if $DEBUG > 0; + } else { + warn "Apache::StatINC: process $$ reloading $key.\n" + if $DEBUG > 0; + } } $Stat{$file} = $mtime; }