Add an --install-signal-handlers=<yes|no> RTS flag; fixes trac #804
[ghc-hetmet.git] / rts / RtsStartup.c
index 5bb9806..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)
@@ -378,6 +380,12 @@ hs_exit(void)
     /* start timing the shutdown */
     stat_startExit();
     
+#if defined(RTS_USER_SIGNALS)
+    if (RtsFlags.MiscFlags.install_signal_handlers) {
+        freeSignalHandlers();
+    }
+#endif
+
 #if defined(THREADED_RTS)
     ioManagerDie();
 #endif
@@ -393,7 +401,7 @@ hs_exit(void)
     
     /* stop the ticker */
     stopTimer();
-    
+
     /* reset the standard file descriptors to blocking mode */
     resetNonBlockingFd(0);
     resetNonBlockingFd(1);
@@ -438,12 +446,24 @@ hs_exit(void)
     // also outputs the stats (+RTS -s) info.
     exitStorage();
     
+    /* free the tasks */
+    freeScheduler();
+
     /* free shared Typeable store */
     exitTypeableStore();
 
-    /* initialise the stable pointer table */
+    /* free the stable pointer table */
     exitStablePtrTable();
 
+#if defined(PROFILING) || defined(DEBUG)
+    freeProfiling1();
+#endif
+
+#if defined(DEBUG)
+    /* free the thread label table */
+    freeThreadLabelTable();
+#endif
+
     /* free hash table storage */
     exitHashTable();