X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fwin32%2FConsoleHandler.c;h=76ebea05832289912005d2b914676ee467ece765;hb=c004ec62b41aa2137b5b5e298ca562609b0de92e;hp=5b5cfc338bcde8f70dc12684a5f3a092ab7178ce;hpb=80a766fdb6864eae613962e43ad9eb371e0ce80c;p=ghc-hetmet.git diff --git a/rts/win32/ConsoleHandler.c b/rts/win32/ConsoleHandler.c index 5b5cfc3..76ebea0 100644 --- a/rts/win32/ConsoleHandler.c +++ b/rts/win32/ConsoleHandler.c @@ -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) @@ -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; } }