summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lynagh <igloo@earth.li>2007-03-22 18:29:00 +0000
committerIan Lynagh <igloo@earth.li>2007-03-22 18:29:00 +0000
commit4cc37e5758909aaec9ede20604ec4f01c04b54ea (patch)
tree66f86e0def7572cd8a460ba2dbb2a0c95e249606
parentaba08f650f66a7979b7d8e513f8630663f33f4fb (diff)
downloadhaskell-4cc37e5758909aaec9ede20604ec4f01c04b54ea.tar.gz
Add an --install-signal-handlers=<yes|no> RTS flag; fixes trac #804
-rw-r--r--includes/RtsFlags.h1
-rw-r--r--rts/RtsFlags.c21
-rw-r--r--rts/RtsStartup.c14
-rw-r--r--rts/Schedule.c9
-rw-r--r--rts/posix/Select.c2
-rw-r--r--rts/sm/GC.c12
6 files changed, 46 insertions, 13 deletions
diff --git a/includes/RtsFlags.h b/includes/RtsFlags.h
index 6efd24d106..f7f79b6980 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 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;