[project @ 2002-12-05 23:49:43 by mthomas]
[ghc-hetmet.git] / ghc / rts / Signals.c
index d2a61e3..b8d2cf3 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: Signals.c,v 1.28 2002/09/06 14:34:13 simonmar Exp $
+ * $Id: Signals.c,v 1.30 2002/12/05 14:20:55 stolz Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
@@ -228,9 +228,13 @@ stg_sig_install(int sig, int spi, StgStablePtr *handler, void *mask)
        break;
 
     case STG_SIG_HAN:
+    case STG_SIG_RST:
        handlers[sig] = (StgInt)*handler;
        sigaddset(&userSignals, sig);
        action.sa_handler = generic_handler;
+       if (spi == STG_SIG_RST) {
+           action.sa_flags = SA_RESETHAND;
+       }
        n_haskell_handlers++;
        break;
 
@@ -243,7 +247,7 @@ stg_sig_install(int sig, int spi, StgStablePtr *handler, void *mask)
     else
        sigemptyset(&action.sa_mask);
 
-    action.sa_flags = sig == SIGCHLD && nocldstop ? SA_NOCLDSTOP : 0;
+    action.sa_flags |= sig == SIGCHLD && nocldstop ? SA_NOCLDSTOP : 0;
 
     if (sigaction(sig, &action, NULL) || 
        sigprocmask(SIG_SETMASK, &osignals, NULL)) 
@@ -286,6 +290,27 @@ startSignalHandlers(void)
   unblockUserSignals();
 }
 
+/* ----------------------------------------------------------------------------
+ * Mark signal handlers during GC.
+ *
+ * We do this rather than trying to start all the signal handlers
+ * prior to GC, because that requires extra heap for the new threads.
+ * Signals must be blocked (see blockUserSignals() above) during GC to
+ * avoid race conditions.
+ * -------------------------------------------------------------------------- */
+
+void
+markSignalHandlers (evac_fn evac)
+{
+    StgPtr *p;
+
+    p = next_pending_handler;
+    while (p != pending_handler_buf) {
+       p--;
+       evac((StgClosure **)p);
+    }
+}
+
 #else // PAR
 StgInt 
 stg_sig_install(StgInt sig, StgInt spi, StgStablePtr handler, sigset_t *mask)