X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fwin32%2FConsoleHandler.c;h=a2de74b54a2f9d606cad7e01de65bf15bb8592e5;hb=refs%2Ftags%2F2006-12-16;hp=afaa4245b83740191c37685add7ab12d94d49e69;hpb=1cb0eb071f1316d6650f354166506789a2638720;p=ghc-hetmet.git diff --git a/rts/win32/ConsoleHandler.c b/rts/win32/ConsoleHandler.c index afaa424..a2de74b 100644 --- a/rts/win32/ConsoleHandler.c +++ b/rts/win32/ConsoleHandler.c @@ -18,7 +18,9 @@ static BOOL WINAPI shutdown_handler(DWORD dwCtrlType); static BOOL WINAPI generic_handler(DWORD dwCtrlType); static rtsBool deliver_event = rtsTrue; -static StgInt console_handler = STG_SIG_DFL; +StgInt console_handler = STG_SIG_DFL; + +#if !defined(THREADED_RTS) static HANDLE hConsoleEvent = INVALID_HANDLE_VALUE; @@ -26,6 +28,8 @@ static HANDLE hConsoleEvent = INVALID_HANDLE_VALUE; StgInt stg_pending_events = 0; /* number of undelivered events */ DWORD stg_pending_buf[N_PENDING_EVENTS]; /* their associated event numbers. */ +#endif + /* * Function: initUserSignals() * @@ -34,8 +38,9 @@ DWORD stg_pending_buf[N_PENDING_EVENTS]; /* their associated event numbers. */ void initUserSignals(void) { - stg_pending_events = 0; console_handler = STG_SIG_DFL; +#if !defined (THREADED_RTS) + stg_pending_events = 0; if (hConsoleEvent == INVALID_HANDLE_VALUE) { hConsoleEvent = CreateEvent ( NULL, /* default security attributes */ @@ -43,16 +48,24 @@ initUserSignals(void) FALSE, /* initially non-signalled */ NULL); /* no name */ } +#endif return; } +void +freeSignalHandlers(void) { + /* Do nothing */ +} + /* Seems to be a bit of an orphan...where used? */ void finiUserSignals(void) { +#if !defined (THREADED_RTS) if (hConsoleEvent != INVALID_HANDLE_VALUE) { CloseHandle(hConsoleEvent); } +#endif } /* @@ -83,9 +96,6 @@ static BOOL WINAPI shutdown_handler(DWORD dwCtrlType) stg_exit(EXIT_INTERRUPTED); } else { interruptStgRts(); - /* Cheesy pulsing of an event to wake up a waiting RTS thread, if any */ - abandonRequestWait(); - resetAbandonRequestWait(); } return TRUE; @@ -148,6 +158,7 @@ void awaitUserSignals(void) } +#if !defined (THREADED_RTS) /* * Function: startSignalHandlers() * @@ -180,6 +191,7 @@ void startSignalHandlers(Capability *cap) RELEASE_LOCK(&sched_mutex); unblockUserSignals(); } +#endif /* !THREADED_RTS */ /* * Function: markSignalHandlers() @@ -202,8 +214,6 @@ void markSignalHandlers (evac_fn evac STG_UNUSED) */ static BOOL WINAPI generic_handler(DWORD dwCtrlType) { - ACQUIRE_LOCK(&sched_mutex); - /* Ultra-simple -- up the counter + signal a switch. */ switch(dwCtrlType) { case CTRL_CLOSE_EVENT: @@ -217,17 +227,16 @@ static BOOL WINAPI generic_handler(DWORD dwCtrlType) default: if (!deliver_event) return TRUE; +#if defined(THREADED_RTS) + sendIOManagerEvent((StgWord8) ((dwCtrlType<<1) | 1)); +#else if ( stg_pending_events < N_PENDING_EVENTS ) { stg_pending_buf[stg_pending_events] = dwCtrlType; stg_pending_events++; } - /* Cheesy pulsing of an event to wake up a waiting RTS thread, if any */ - abandonRequestWait(); - resetAbandonRequestWait(); +#endif return TRUE; } - - RELEASE_LOCK(&sched_mutex); } @@ -293,17 +302,22 @@ rts_InstallConsoleEvent(int action, StgStablePtr *handler) * */ void -rts_ConsoleHandlerDone(int ev) +rts_ConsoleHandlerDone (int ev USED_IF_NOT_THREADS) { +#if !defined(THREADED_RTS) if ( (DWORD)ev == CTRL_BREAK_EVENT || (DWORD)ev == CTRL_C_EVENT ) { /* only these two cause stdin system calls to abort.. */ SetEvent(hConsoleEvent); /* event is manual-reset */ Sleep(0); /* yield */ ResetEvent(hConsoleEvent); /* turn it back off again */ + // SDM: yeuch, this can't possibly work reliably. + // I'm not having it in THREADED_RTS. } +#endif } +#if !defined(THREADED_RTS) /* * Function: rts_waitConsoleHandlerCompletion() * @@ -318,3 +332,4 @@ rts_waitConsoleHandlerCompletion() */ return (WaitForSingleObject(hConsoleEvent, INFINITE) == WAIT_OBJECT_0); } +#endif