/* -----------------------------------------------------------------------------
- * $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
*
// 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
void
blockUserSignals(void)
{
- sigprocmask(SIG_SETMASK, &userSignals, &savedSignals);
+ sigprocmask(SIG_BLOCK, &userSignals, &savedSignals);
}
void
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;
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))