X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FSignals.c;h=90b46ba9b9b1e24237f43c231a9bf4c85550ee6c;hb=3ddfe34ba0b8b1c0721841c73d0c671e43a600ac;hp=6e5d859fda690784c0c31722ca4ff741c4f4603b;hpb=1862438e1e29c4f4069d9ca43b25445078547faa;p=ghc-hetmet.git diff --git a/ghc/rts/Signals.c b/ghc/rts/Signals.c index 6e5d859..90b46ba 100644 --- a/ghc/rts/Signals.c +++ b/ghc/rts/Signals.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Signals.c,v 1.8 1999/09/22 11:53:33 sof Exp $ + * $Id: Signals.c,v 1.14 2000/02/29 14:38:19 simonmar Exp $ * * (c) The GHC Team, 1998-1999 * @@ -48,8 +48,7 @@ more_handlers(I_ sig) if (handlers == NULL) { /* don't fflush(stdout); WORKAROUND bug in Linux glibc */ - fprintf(stderr, "VM exhausted (in more_handlers)\n"); - exit(EXIT_FAILURE); + barf("VM exhausted (in more_handlers)"); } for(i = nHandlers; i <= sig; i++) /* Fill in the new slots with default actions */ @@ -218,10 +217,6 @@ start_signal_handlers(void) next_pending_handler--; - /* create*Thread puts the thread on the head of the runnable - * queue, hence it will be run next. Poor man's priority - * scheduling. - */ createIOThread(RtsFlags.GcFlags.initialStkSize, (StgClosure *) *next_pending_handler); } @@ -234,9 +229,7 @@ StgInt sig_install(StgInt sig, StgInt spi, StgStablePtr handler, sigset_t *mask) { /* don't fflush(stdout); WORKAROUND bug in Linux glibc */ - fprintf(stderr, - "No signal handling support in a parallel implementation.\n"); - exit(EXIT_FAILURE); + barf("no signal handling support in a parallel implementation"); } void @@ -245,38 +238,66 @@ start_signal_handlers(void) } #endif +/* ----------------------------------------------------------------------------- + SIGINT handler. + + We like to shutdown nicely after receiving a SIGINT, write out the + stats, write profiling info, close open files and flush buffers etc. + -------------------------------------------------------------------------- */ + +#ifdef SMP +pthread_t startup_guy; +#endif + static void -shutdown_handler(int sig) +shutdown_handler(int sig STG_UNUSED) { - shutdownHaskellAndExit(EXIT_FAILURE); +#ifdef SMP + /* if I'm a worker thread, send this signal to the guy who + * originally called startupHaskell(). Since we're handling + * the signal, it won't be a "send to all threads" type of signal + * (according to the POSIX threads spec). + */ + if (pthread_self() != startup_guy) { + pthread_kill(startup_guy, sig); + } else +#endif + + interruptStgRts(); } /* * The RTS installs a default signal handler for catching - * SIGINT, so that we can perform an orderly shutdown (finalising - * objects and flushing buffers etc.) + * SIGINT, so that we can perform an orderly shutdown. * * 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_shutdown_handler() +init_default_handlers() { struct sigaction action,oact; +#ifdef SMP + startup_guy = pthread_self(); +#endif action.sa_handler = shutdown_handler; sigemptyset(&action.sa_mask); action.sa_flags = 0; if (sigaction(SIGINT, &action, &oact) != 0) { /* Oh well, at least we tried. */ -#ifdef DEBUG - fprintf(stderr, "init_shutdown_handler: failed to reg SIGINT handler"); -#endif + 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"); + } +} #endif /*! mingw32_TARGET_OS */