X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FSignals.c;h=3312b153b408557f6bf83aa6896fe778f9ec66b8;hb=7385dd9fa7f062997a2860ea13e2c268e0783c40;hp=90b46ba9b9b1e24237f43c231a9bf4c85550ee6c;hpb=2edb47935ae6e86c1e55efba9f2fa0ddf69dcd6f;p=ghc-hetmet.git diff --git a/ghc/rts/Signals.c b/ghc/rts/Signals.c index 90b46ba..3312b15 100644 --- a/ghc/rts/Signals.c +++ b/ghc/rts/Signals.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Signals.c,v 1.14 2000/02/29 14:38:19 simonmar Exp $ + * $Id: Signals.c,v 1.18 2000/08/25 13:12:07 simonmar Exp $ * * (c) The GHC Team, 1998-1999 * @@ -7,6 +7,8 @@ * * ---------------------------------------------------------------------------*/ +#define NON_POSIX_SOURCE + #include "Rts.h" #include "SchedAPI.h" #include "Schedule.h" @@ -19,6 +21,7 @@ #ifndef PAR +/* SUP: The type of handlers is a little bit, well, doubtful... */ static StgInt *handlers = NULL; /* Dynamically grown array of signal handlers */ static StgInt nHandlers = 0; /* Size of handlers array */ @@ -97,7 +100,7 @@ generic_handler(int sig) circumstances, depending on the signal. */ - *next_pending_handler++ = deRefStablePtr(handlers[sig]); + *next_pending_handler++ = deRefStablePtr(stgCast(StgStablePtr,handlers[sig])); /* stack full? */ if (next_pending_handler == &pending_handler_buf[N_PENDING_HANDLERS]) { @@ -196,7 +199,7 @@ sig_install(StgInt sig, StgInt spi, StgStablePtr handler, sigset_t *mask) * by freeing the previous handler if there was one. */ if (previous_spi >= 0) { - freeStablePtr(handlers[sig]); + freeStablePtr(stgCast(StgStablePtr,handlers[sig])); } return STG_SIG_ERR; } @@ -217,8 +220,9 @@ start_signal_handlers(void) next_pending_handler--; - createIOThread(RtsFlags.GcFlags.initialStkSize, - (StgClosure *) *next_pending_handler); + scheduleThread( + createIOThread(RtsFlags.GcFlags.initialStkSize, + (StgClosure *) *next_pending_handler)); } unblockUserSignals(); @@ -263,7 +267,15 @@ shutdown_handler(int sig STG_UNUSED) } else #endif - interruptStgRts(); + /* If we're already trying to interrupt the RTS, terminate with + * extreme prejudice. So the first ^C tries to exit the program + * cleanly, and the second one just kills it. + */ + if (interrupted) { + exit(EXIT_INTERRUPTED); + } else { + interruptStgRts(); + } } /* @@ -273,10 +285,6 @@ shutdown_handler(int sig STG_UNUSED) * Haskell code may install their own SIGINT handler, which is * fine, provided they're so kind as to put back the old one * when they de-install. - * - * We ignore SIGPIPE, because our I/O library handles EPIPE properly, - * and a SIGPIPE tends to cause the program to exit silently and - * mysteriously. */ void init_default_handlers() @@ -294,10 +302,7 @@ init_default_handlers() prog_belch("failed to install SIGINT handler"); } - action.sa_handler = SIG_IGN; - if (sigaction(SIGPIPE, &action, &oact) != 0) { - prog_belch("failed to install SIGINT handler"); - } + siginterrupt(SIGINT, 1); } #endif /*! mingw32_TARGET_OS */