You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by Randy Harmon <rj...@fortheweb.com> on 2002/10/13 03:12:57 UTC

Apache::Reload - patch - fixes problems with using dynamic @INC

I started using a dynamic @INC (set up in a TransHandler), and discovered
that Apache::Reload (v0.07) was not doing its job correctly in that case.
Note, changing @INC in a transhandler won't have the desired Apache::Reload
effects unless the PerlInitHandler for Apache::Reload is placed in a
<Location> section of httpd.conf.

The following patch corrects this, though it adds a few extra stat() calls
if the module is found at the end of @INC instead of near the beginning (as
mine are).  You could make this behavior an optional one for strange folks
like me :).  Oh, I just added that to the patch manually:

   PerlSetVar ReloadDynamicInc 1

...will enable this @INC-scanning behavior.  I think I hacked the patch
correctly :)

Note, if a module is loaded with one @INC, then on a subsequent request,
@INC changes such that the module would be not-found, the module is not
removed from memory.  If you do that and use it from a script (served when
@INC doesn't have the module), you'll get erratic behavior - it'll work fine
sometimes and error out other times.  "So don't do that.", as a wise man
said.  Instead, make sure @INC always has the right libs for your script -
test from a freshly-started server to be sure.

Separate from this strange Dynamic-@INC use case, there's another bug in the
release version of the module: if you moved a module from one @INC dir to
another, the @INC loop at the top of handler() would not find the file, as
it was looking for <inc-dir>/<full-path-name> instead of
<inc-dir>/<relative-path-name>.  This patch should fix this too, whether
ReloadDynamicInc is used or not.

I haven't tested this with wildcard settings or ReloadAll.

Enjoy,

Randy


--- Reload.pm	Sat Oct 12 16:22:02 2002
+++ Reload.pm.new	Sat Oct 12 17:08:07 2002
@@ -108,35 +108,40 @@

     while (my($key, $file) = each %Apache::Reload::INCS) {
         local $^W;
         warn "Apache::Reload: Checking mtime of $key\n" if $DEBUG;

         my $mtime = (stat $file)[9];

-        unless (defined($mtime) && $mtime) {
-            for (@INC) {
-                $mtime = (stat "$_/$file")[9];
-                last if defined($mtime) && $mtime;
-            }
-        }
+
+        my $found = $file;
+        if( $r->dir_config("ReloadDynamicInc") || !$mtime ) {
+            # seek out the file in @INC.
+            my $mt;
+            for (@INC) {
+                $mt = (stat "$_/$key")[9];
+                $mtime = $mt, $found = "$_/$key", last if defined($mt) &&
$mt;
+            }
+        }
+
         warn("Apache::Reload: Can't locate $file\n"),next
                 unless defined $mtime and $mtime;

         unless (defined $Stat{$file}) {
             $Stat{$file} = $^T;
         }

-        if ($mtime > $Stat{$file}) {
+        if( $found ne $file || $mtime > $Stat{$file} ) {
             delete $INC{$key};
             if (my $symref = $UndefFields{$key}) {
 #                warn "undeffing fields\n";
                 no strict 'refs';
                 undef %{$symref};