[project @ 2003-01-10 22:08:20 by wolfgang]
[ghc-hetmet.git] / ghc / rts / Signals.c
index 68a9d5c..8e33d9d 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: Signals.c,v 1.29 2002/09/17 12:11:45 simonmar Exp $
+ * $Id: Signals.c,v 1.32 2003/01/10 22:08:20 wolfgang Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
@@ -137,7 +137,8 @@ generic_handler(int sig)
 
     // stack full?
     if (next_pending_handler == &pending_handler_buf[N_PENDING_HANDLERS]) {
-       barf("too many pending signals");
+       prog_belch("too many pending signals");
+       stg_exit(EXIT_FAILURE);
     }
     
     // re-establish the signal handler, and carry on
@@ -169,7 +170,7 @@ initUserSignals(void)
 void
 blockUserSignals(void)
 {
-    sigprocmask(SIG_SETMASK, &userSignals, &savedSignals);
+    sigprocmask(SIG_BLOCK, &userSignals, &savedSignals);
 }
 
 void
@@ -228,9 +229,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 +248,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))