X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FSignals.c;h=68a9d5cd2928766f97d205ad1aed649da2844e3e;hb=48c557b5117015fcec8e6fb05e7de558cca462fc;hp=d2a61e3d403a0b9b53f8c9577a71fc37d3d50e3f;hpb=67419f264a735dfd95001d0d8aedb28d01cdb18a;p=ghc-hetmet.git diff --git a/ghc/rts/Signals.c b/ghc/rts/Signals.c index d2a61e3..68a9d5c 100644 --- a/ghc/rts/Signals.c +++ b/ghc/rts/Signals.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Signals.c,v 1.28 2002/09/06 14:34:13 simonmar Exp $ + * $Id: Signals.c,v 1.29 2002/09/17 12:11:45 simonmar Exp $ * * (c) The GHC Team, 1998-1999 * @@ -286,6 +286,27 @@ startSignalHandlers(void) unblockUserSignals(); } +/* ---------------------------------------------------------------------------- + * Mark signal handlers during GC. + * + * We do this rather than trying to start all the signal handlers + * prior to GC, because that requires extra heap for the new threads. + * Signals must be blocked (see blockUserSignals() above) during GC to + * avoid race conditions. + * -------------------------------------------------------------------------- */ + +void +markSignalHandlers (evac_fn evac) +{ + StgPtr *p; + + p = next_pending_handler; + while (p != pending_handler_buf) { + p--; + evac((StgClosure **)p); + } +} + #else // PAR StgInt stg_sig_install(StgInt sig, StgInt spi, StgStablePtr handler, sigset_t *mask)