From 4cc37e5758909aaec9ede20604ec4f01c04b54ea Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Thu, 22 Mar 2007 18:29:00 +0000 Subject: [PATCH] Add an --install-signal-handlers= RTS flag; fixes trac #804 --- includes/RtsFlags.h | 1 + rts/RtsFlags.c | 21 +++++++++++++++++++++ rts/RtsStartup.c | 14 +++++++++----- rts/Schedule.c | 9 ++++++--- rts/posix/Select.c | 2 +- rts/sm/GC.c | 12 ++++++++---- 6 files changed, 46 insertions(+), 13 deletions(-) diff --git a/includes/RtsFlags.h b/includes/RtsFlags.h index 6efd24d..f7f79b6 100644 --- a/includes/RtsFlags.h +++ b/includes/RtsFlags.h @@ -117,6 +117,7 @@ struct CONCURRENT_FLAGS { struct MISC_FLAGS { int tickInterval; /* in milliseconds */ + rtsBool install_signal_handlers; }; #ifdef PAR diff --git a/rts/RtsFlags.c b/rts/RtsFlags.c index a3d1d83..2dbd241 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=", +" Install signal handlers (default: yes)", #if defined(THREADED_RTS) || defined(PAR) " -e 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 deb38e0..85b1c02 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 e328b5b..fa8a651 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 bb65310..57599bc 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 270784e..1fee394 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; -- 1.7.10.4