From dd2dd733c0db08ec89c62218203e07e98287480d Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 12 Oct 2010 21:18:00 -0600 Subject: [PATCH] win32: more break-handling repairs --- src/gracket/grmain.c | 4 +++- src/racket/main.c | 22 ++++++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/gracket/grmain.c b/src/gracket/grmain.c index 0a1f42eeae..17b4247795 100644 --- a/src/gracket/grmain.c +++ b/src/gracket/grmain.c @@ -105,6 +105,7 @@ static HWND console_hwnd; static int has_stdio, stdio_kills_prog; static HANDLE waiting_sema; static void *orig_signal_handle; +static void *orig_break_handle; typedef HWND (WINAPI* gcw_proc)(); @@ -122,7 +123,7 @@ static BOOL WINAPI ConsoleHandler(DWORD op) if (stdio_kills_prog) { ReleaseSemaphore(waiting_sema, 1, NULL); } else { - scheme_break_main_thread(); + scheme_break_main_thread_at(orig_break_handle); scheme_signal_received_at(orig_signal_handle); } return TRUE; @@ -164,6 +165,7 @@ static void MrEdSchemeMessages(char *msg, ...) has_stdio = 1; waiting_sema = CreateSemaphore(NULL, 0, 1, NULL); orig_signal_handle = scheme_get_signal_handle(); + orig_break_handle = scheme_get_main_thread_break_handle(); SetConsoleCtrlHandler(ConsoleHandler, TRUE); { diff --git a/src/racket/main.c b/src/racket/main.c index ac5f93d941..adc917133b 100644 --- a/src/racket/main.c +++ b/src/racket/main.c @@ -168,11 +168,13 @@ extern Scheme_Object *scheme_initialize(Scheme_Env *env); /* ctl-C handler */ /*========================================================================*/ -#ifndef NO_USER_BREAK_HANDLER +#if !defined(NO_USER_BREAK_HANDLER) || defined(DOS_FILE_SYSTEM) static void *break_handle; static void *signal_handle; +# ifndef NO_USER_BREAK_HANDLER + static void user_break_hit(int ignore) { scheme_break_main_thread_at(break_handle); @@ -189,6 +191,17 @@ static void user_break_hit(int ignore) # endif } +# endif + +# ifdef DOS_FILE_SYSTEM +static BOOL WINAPI ConsoleBreakHandler(DWORD op) +{ + scheme_break_main_thread_at(break_handle); + scheme_signal_received_at(signal_handle); + return TRUE; +} +#endif + #endif /*========================================================================*/ @@ -314,10 +327,15 @@ static int main_after_stack(void *data) } #endif -#ifndef NO_USER_BREAK_HANDLER +#if !defined(NO_USER_BREAK_HANDLER) || defined(DOS_FILE_SYSTEM) break_handle = scheme_get_main_thread_break_handle(); signal_handle = scheme_get_signal_handle(); +# ifndef NO_USER_BREAK_HANDLER MZ_SIGSET(SIGINT, user_break_hit); +# endif +# ifdef DOS_FILE_SYSTEM + SetConsoleCtrlHandler(ConsoleBreakHandler, TRUE); +# endif #endif rval = run_from_cmd_line(argc, argv, scheme_basic_env, cont_run);