diff options
author | simonmar <unknown> | 1999-11-02 15:06:05 +0000 |
---|---|---|
committer | simonmar <unknown> | 1999-11-02 15:06:05 +0000 |
commit | f6692611aad945e46ffb615bde1df7def3fc742f (patch) | |
tree | 04e2e2af9c43eba1b60312b89eb3ac8f34209e2c /ghc/rts/Signals.c | |
parent | 947d2e363f75e9e230d535c876ecdafba45174b5 (diff) | |
download | haskell-f6692611aad945e46ffb615bde1df7def3fc742f.tar.gz |
[project @ 1999-11-02 15:05:38 by simonmar]
This commit adds in the current state of our SMP support. Notably,
this allows the new way 's' to be built, providing support for running
multiple Haskell threads simultaneously on top of any pthreads
implementation, the idea being to take advantage of commodity SMP
boxes.
Don't expect to get much of a speedup yet; due to the excessive
locking required to synchronise access to mutable heap objects, you'll
see a slowdown in most cases, even on a UP machine. The best I've
seen is a 1.6-1.7 speedup on an example that did no locking (two
optimised nfibs in parallel).
- new RTS -N flag specifies how many pthreads to start.
- new driver -smp flag, tells the driver to use way 's'.
- new compiler -fsmp option (not for user comsumption)
tells the compiler not to generate direct jumps to
thunk entry code.
- largely rewritten scheduler
- _ccall_GC is now done by handing back a "token" to the
RTS before executing the ccall; it should now be possible
to execute blocking ccalls in the current thread while
allowing the RTS to continue running Haskell threads as
normal.
- you can only call thread-safe C libraries from a way 's'
build, of course.
Pthread support is still incomplete, and weird things (including
deadlocks) are likely to happen.
Diffstat (limited to 'ghc/rts/Signals.c')
-rw-r--r-- | ghc/rts/Signals.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/ghc/rts/Signals.c b/ghc/rts/Signals.c index 6e5d859fda..730ede485b 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.9 1999/11/02 15:06:02 simonmar Exp $ * * (c) The GHC Team, 1998-1999 * @@ -245,16 +245,37 @@ 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) { +#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 + shutdownHaskellAndExit(EXIT_FAILURE); } /* * 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 @@ -265,6 +286,9 @@ init_shutdown_handler() { struct sigaction action,oact; +#ifdef SMP + startup_guy = pthread_self(); +#endif action.sa_handler = shutdown_handler; sigemptyset(&action.sa_mask); action.sa_flags = 0; |