win32: more break-handling repairs

This commit is contained in:
Matthew Flatt 2010-10-12 21:18:00 -06:00
parent 9702e7c6d3
commit dd2dd733c0
2 changed files with 23 additions and 3 deletions

View File

@ -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);
{

View File

@ -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);
@ -191,6 +193,17 @@ static void user_break_hit(int ignore)
# 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
/*========================================================================*/
/* main */
/*========================================================================*/
@ -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);