Paul - 

    After looking at this problem for a while longer, I've come up with the
    attached patch which solves the problem (at least for #ifdef POSIX).

    When name_mtime() is called, SIGCHLD is not set to SIG_IGN or SIG_DFL,
    but has a signal handler assigned.  This causes the signal to be
    delivered which, of course, interrupts the system call causing make
    to believe that the file doesn't exist.

    Blocking SIGCHLD for just name_mtime() works great, but you have a
    much better understanding of the program flow so maybe you'd prefer
    putting the SIGCHLD blocking at a higher level.

    I hope something like this patch can make it into make-3.79.1.

    Thanks for your help, BTW.  The suggestion of adding perror() really
    got me headed in the right direction.

Michael Sterrett
  -Mr. Bones.-
[EMAIL PROTECTED]
--- make-3.78.1.orig/remake.c   Thu Sep  9 11:30:27 1999
+++ make-3.78.1/remake.c        Fri May 19 17:47:26 2000
@@ -1188,9 +1188,25 @@
      register char *name;
 {
   struct stat st;
+#ifdef POSIX
+  sigset_t signal_set;
+  sigset_t save_signal_set;
 
+  (void) sigprocmask (SIG_BLOCK, (sigset_t *) 0, &save_signal_set);
+  signal_set = save_signal_set;
+  sigaddset (&signal_set, SIGCHLD);
+  (void) sigprocmask (SIG_BLOCK, &signal_set, (sigset_t *) 0);
+#endif
   if (stat (name, &st) < 0)
-    return (FILE_TIMESTAMP) -1;
+    {
+#ifdef POSIX
+      sigprocmask (SIG_SETMASK, &save_signal_set, (sigset_t *) 0);
+#endif
+      return (FILE_TIMESTAMP) -1;
+    }
+#ifdef POSIX
+  sigprocmask (SIG_SETMASK, &save_signal_set, (sigset_t *) 0);
+#endif
 
   return FILE_TIMESTAMP_STAT_MODTIME (st);
 }

Reply via email to