diff options
author | Ian Lynagh <igloo@earth.li> | 2007-03-22 18:29:00 +0000 |
---|---|---|
committer | Ian Lynagh <igloo@earth.li> | 2007-03-22 18:29:00 +0000 |
commit | 4cc37e5758909aaec9ede20604ec4f01c04b54ea (patch) | |
tree | 66f86e0def7572cd8a460ba2dbb2a0c95e249606 /rts | |
parent | aba08f650f66a7979b7d8e513f8630663f33f4fb (diff) | |
download | haskell-4cc37e5758909aaec9ede20604ec4f01c04b54ea.tar.gz |
Add an --install-signal-handlers=<yes|no> RTS flag; fixes trac #804
Diffstat (limited to 'rts')
-rw-r--r-- | rts/RtsFlags.c | 21 | ||||
-rw-r--r-- | rts/RtsStartup.c | 14 | ||||
-rw-r--r-- | rts/Schedule.c | 9 | ||||
-rw-r--r-- | rts/posix/Select.c | 2 | ||||
-rw-r--r-- | rts/sm/GC.c | 12 |
5 files changed, 45 insertions, 13 deletions
diff --git a/rts/RtsFlags.c b/rts/RtsFlags.c index a3d1d83603..2dbd241f04 100644 --- a/rts/RtsFlags.c +++ b/rts/RtsFlags.c @@ -194,6 +194,8 @@ void initRtsFlagsDefaults(void) RtsFlags.MiscFlags.tickInterval = 50; /* In milliseconds */ RtsFlags.ConcFlags.ctxtSwitchTime = 50; /* In milliseconds */ + RtsFlags.MiscFlags.install_signal_handlers = rtsTrue; + #ifdef THREADED_RTS RtsFlags.ParFlags.nNodes = 1; RtsFlags.ParFlags.migrate = rtsTrue; @@ -436,6 +438,8 @@ usage_text[] = { " -qm Don't automatically migrate threads between CPUs", " -qw Migrate a thread to the current CPU when it is woken up", #endif +" --install-signal-handlers=<yes|no>", +" Install signal handlers (default: yes)", #if defined(THREADED_RTS) || defined(PAR) " -e<size> Size of spark pools (default 100)", #endif @@ -657,6 +661,23 @@ error = rtsTrue; error = rtsTrue; break; + /* This isn't going to allow us to keep related options + together as we add more --* flags. We really need a + proper options parser. */ + case '-': + if (strequal("install-signal-handlers=yes", + &rts_argv[arg][2])) { + RtsFlags.MiscFlags.install_signal_handlers = rtsTrue; + } + else if (strequal("install-signal-handlers=no", + &rts_argv[arg][2])) { + RtsFlags.MiscFlags.install_signal_handlers = rtsFalse; + } + else { + errorBelch("unknown RTS option: %s",rts_argv[arg]); + error = rtsTrue; + } + break; case 'A': RtsFlags.GcFlags.minAllocAreaSize = decode(rts_argv[arg]+2) / BLOCK_SIZE; diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c index deb38e05d5..85b1c020fb 100644 --- a/rts/RtsStartup.c +++ b/rts/RtsStartup.c @@ -255,10 +255,12 @@ hs_init(int *argc, char **argv[]) initStats(); #if defined(RTS_USER_SIGNALS) - /* Initialise the user signal handler set */ - initUserSignals(); - /* Set up handler to run on SIGINT, etc. */ - initDefaultHandlers(); + if (RtsFlags.MiscFlags.install_signal_handlers) { + /* Initialise the user signal handler set */ + initUserSignals(); + /* Set up handler to run on SIGINT, etc. */ + initDefaultHandlers(); + } #endif #if defined(mingw32_HOST_OS) && !defined(THREADED_RTS) @@ -379,7 +381,9 @@ hs_exit(void) stat_startExit(); #if defined(RTS_USER_SIGNALS) - freeSignalHandlers(); + if (RtsFlags.MiscFlags.install_signal_handlers) { + freeSignalHandlers(); + } #endif #if defined(THREADED_RTS) diff --git a/rts/Schedule.c b/rts/Schedule.c index e328b5b8cf..fa8a65128a 100644 --- a/rts/Schedule.c +++ b/rts/Schedule.c @@ -862,7 +862,8 @@ schedulePushWork(Capability *cap USED_IF_THREADS, static void scheduleStartSignalHandlers(Capability *cap) { - if (signals_pending()) { // safe outside the lock + if (RtsFlags.MiscFlags.install_signal_handlers && signals_pending()) { + // safe outside the lock startSignalHandlers(cap); } } @@ -985,7 +986,7 @@ scheduleDetectDeadlock (Capability *cap, Task *task) * for signals to arrive rather then bombing out with a * deadlock. */ - if ( anyUserHandlers() ) { + if ( RtsFlags.MiscFlags.install_signal_handlers && anyUserHandlers() ) { debugTrace(DEBUG_sched, "still deadlocked, waiting for signals..."); @@ -2708,7 +2709,9 @@ GetRoots( evac_fn evac ) #if defined(RTS_USER_SIGNALS) // mark the signal handlers (signals should be already blocked) - markSignalHandlers(evac); + if (RtsFlags.MiscFlags.install_signal_handlers) { + markSignalHandlers(evac); + } #endif } diff --git a/rts/posix/Select.c b/rts/posix/Select.c index bb65310c9e..57599bcee4 100644 --- a/rts/posix/Select.c +++ b/rts/posix/Select.c @@ -208,7 +208,7 @@ awaitEvent(rtsBool wait) * serviced. */ #if defined(RTS_USER_SIGNALS) - if (signals_pending()) { + if (RtsFlags.MiscFlags.install_signal_handlers && signals_pending()) { startSignalHandlers(&MainCapability); return; /* still hold the lock */ } diff --git a/rts/sm/GC.c b/rts/sm/GC.c index 270784e457..1fee394139 100644 --- a/rts/sm/GC.c +++ b/rts/sm/GC.c @@ -208,8 +208,10 @@ GarbageCollect ( rtsBool force_major_gc ) debugTrace(DEBUG_gc, "starting GC"); #if defined(RTS_USER_SIGNALS) - // block signals - blockUserSignals(); + if (RtsFlags.MiscFlags.install_signal_handlers) { + // block signals + blockUserSignals(); + } #endif // tell the STM to discard any cached closures its hoping to re-use @@ -1014,8 +1016,10 @@ GarbageCollect ( rtsBool force_major_gc ) stat_endGC(allocated, live, copied, scavd_copied, N); #if defined(RTS_USER_SIGNALS) - // unblock signals again - unblockUserSignals(); + if (RtsFlags.MiscFlags.install_signal_handlers) { + // unblock signals again + unblockUserSignals(); + } #endif RELEASE_SM_LOCK; |