64-bit fixes
[ghc-hetmet.git] / rts / win32 / ConsoleHandler.c
index 5b5cfc3..2cd10ec 100644 (file)
@@ -52,6 +52,11 @@ initUserSignals(void)
     return;
 }
 
+void
+freeSignalHandlers(void) {
+    /* Do nothing */
+}
+
 /* Seems to be a bit of an orphan...where used? */
 void
 finiUserSignals(void)
@@ -194,7 +199,7 @@ void startSignalHandlers(Capability *cap)
  * Evacuate the handler stack. _Assumes_ that console event delivery
  * has already been blocked.
  */
-void markSignalHandlers (evac_fn evac STG_UNUSED)
+void markSignalHandlers (evac_fn evac STG_UNUSED, void *user STG_UNUSED)
 {
     // nothing to mark; the console handler is a StablePtr which is
     // already treated as a root by the GC.
@@ -259,8 +264,13 @@ rts_InstallConsoleEvent(int action, StgStablePtr *handler)
        }
        break;
     case STG_SIG_HAN:
+#ifdef THREADED_RTS
+        // handler is stored in an MVar in the threaded RTS
+       console_handler = STG_SIG_HAN;
+#else
        console_handler = (StgInt)*handler;
-       if ( previous_hdlr < 0 ) {
+#endif
+       if (previous_hdlr < 0 || previous_hdlr == STG_SIG_HAN) {
          /* Only install generic_handler() once */
          if ( !SetConsoleCtrlHandler(generic_handler, TRUE) ) {
            errorBelch("warning: unable to install console event handler");
@@ -270,10 +280,13 @@ rts_InstallConsoleEvent(int action, StgStablePtr *handler)
     }
     
     if (previous_hdlr == STG_SIG_DFL || 
-       previous_hdlr == STG_SIG_IGN) {
+       previous_hdlr == STG_SIG_IGN ||
+        previous_hdlr == STG_SIG_HAN) {
        return previous_hdlr;
     } else {
-       *handler = (StgStablePtr)previous_hdlr;
+       if (handler != NULL) {
+            *handler = (StgStablePtr)previous_hdlr;
+        }
        return STG_SIG_HAN;
     }
 }