Add an --install-signal-handlers=<yes|no> RTS flag; fixes trac #804
[ghc-hetmet.git] / rts / RtsStartup.c
index f2a0dd7..85b1c02 100644 (file)
@@ -19,6 +19,7 @@
 #include "STM.h"        /* initSTM */
 #include "Signals.h"
 #include "RtsSignals.h"
+#include "ThrIOManager.h"
 #include "Timer.h"      /* startTimer, stopTimer */
 #include "Weak.h"
 #include "Ticky.h"
@@ -56,7 +57,7 @@
 # include "LLC.h"
 #endif
 
-#if defined(mingw32_HOST_OS)
+#if defined(mingw32_HOST_OS) && !defined(THREADED_RTS)
 #include "win32/AsyncIO.h"
 #endif
 
@@ -137,7 +138,13 @@ hs_init(int *argc, char **argv[])
        return;
     }
 
-    /* The very first thing we do is grab the start time...just in case we're
+#if defined(DEBUG)
+    /* Start off by initialising the allocator debugging so we can
+     * use it anywhere */
+    initAllocator();
+#endif
+
+    /* Next we do is grab the start time...just in case we're
      * collecting timing statistics.
      */
     stat_startInit();
@@ -160,9 +167,18 @@ hs_init(int *argc, char **argv[])
 
     /* Initialise the performance tracking library */
 #ifdef USE_PAPI
-    /* Must fix to abort gracefully */
-    if(PAPI_library_init(PAPI_VER_CURRENT) != PAPI_VER_CURRENT)
-      exit(1);
+    {
+       int ver;
+       if ((ver = PAPI_library_init(PAPI_VER_CURRENT)) != PAPI_VER_CURRENT) {
+           if (ver > 0) {
+               errorBelch("PAPI_library_init: wrong version: %x", ver);
+               stg_exit(EXIT_FAILURE);
+           } else {
+               sysErrorBelch("PAPI_library_init");
+               stg_exit(EXIT_FAILURE);
+           }
+       }
+    }
 #ifdef THREADED_RTS
     {
        int err;
@@ -239,13 +255,15 @@ 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)
+#if defined(mingw32_HOST_OS) && !defined(THREADED_RTS)
     startupAsyncIO();
 #endif
 
@@ -259,7 +277,7 @@ hs_init(int *argc, char **argv[])
     x86_init_fpu();
 #endif
 
-#if defined(THREADED_RTS) && !defined(mingw32_HOST_OS)
+#if defined(THREADED_RTS)
     ioManagerStart();
 #endif
 
@@ -362,7 +380,13 @@ hs_exit(void)
     /* start timing the shutdown */
     stat_startExit();
     
-#if defined(THREADED_RTS) && !defined(mingw32_HOST_OS)
+#if defined(RTS_USER_SIGNALS)
+    if (RtsFlags.MiscFlags.install_signal_handlers) {
+        freeSignalHandlers();
+    }
+#endif
+
+#if defined(THREADED_RTS)
     ioManagerDie();
 #endif
 
@@ -377,7 +401,7 @@ hs_exit(void)
     
     /* stop the ticker */
     stopTimer();
-    
+
     /* reset the standard file descriptors to blocking mode */
     resetNonBlockingFd(0);
     resetNonBlockingFd(1);
@@ -422,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();
 
@@ -456,12 +492,18 @@ hs_exit(void)
     if (RtsFlags.TickyFlags.showTickyStats) PrintTickyInfo();
 #endif
 
-#if defined(mingw32_HOST_OS)
+#if defined(mingw32_HOST_OS) && !defined(THREADED_RTS)
     shutdownAsyncIO();
 #endif
 
-    // Finally, free all our storage.
+    // Finally, free all our storage
     freeStorage();
+
+#if defined(DEBUG)
+    /* and shut down the allocator debugging */
+    shutdownAllocator();
+#endif
+
 }
 
 // Compatibility interfaces