Add an --install-signal-handlers=<yes|no> RTS flag; fixes trac #804
authorIan Lynagh <igloo@earth.li>
Thu, 22 Mar 2007 18:29:00 +0000 (18:29 +0000)
committerIan Lynagh <igloo@earth.li>
Thu, 22 Mar 2007 18:29:00 +0000 (18:29 +0000)
includes/RtsFlags.h
rts/RtsFlags.c
rts/RtsStartup.c
rts/Schedule.c
rts/posix/Select.c
rts/sm/GC.c

index 6efd24d..f7f79b6 100644 (file)
@@ -117,6 +117,7 @@ struct CONCURRENT_FLAGS {
 
 struct MISC_FLAGS {
     int tickInterval;     /* in milliseconds */
+    rtsBool install_signal_handlers;
 };
 
 #ifdef PAR
index a3d1d83..2dbd241 100644 (file)
@@ -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;
index deb38e0..85b1c02 100644 (file)
@@ -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)
index e328b5b..fa8a651 100644 (file)
@@ -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
 }
 
index bb65310..57599bc 100644 (file)
@@ -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 */
          }
index 270784e..1fee394 100644 (file)
@@ -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;