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 int has_stdio, stdio_kills_prog;
static HANDLE waiting_sema; static HANDLE waiting_sema;
static void *orig_signal_handle; static void *orig_signal_handle;
static void *orig_break_handle;
typedef HWND (WINAPI* gcw_proc)(); typedef HWND (WINAPI* gcw_proc)();
@ -122,7 +123,7 @@ static BOOL WINAPI ConsoleHandler(DWORD op)
if (stdio_kills_prog) { if (stdio_kills_prog) {
ReleaseSemaphore(waiting_sema, 1, NULL); ReleaseSemaphore(waiting_sema, 1, NULL);
} else { } else {
scheme_break_main_thread(); scheme_break_main_thread_at(orig_break_handle);
scheme_signal_received_at(orig_signal_handle); scheme_signal_received_at(orig_signal_handle);
} }
return TRUE; return TRUE;
@ -164,6 +165,7 @@ static void MrEdSchemeMessages(char *msg, ...)
has_stdio = 1; has_stdio = 1;
waiting_sema = CreateSemaphore(NULL, 0, 1, NULL); waiting_sema = CreateSemaphore(NULL, 0, 1, NULL);
orig_signal_handle = scheme_get_signal_handle(); orig_signal_handle = scheme_get_signal_handle();
orig_break_handle = scheme_get_main_thread_break_handle();
SetConsoleCtrlHandler(ConsoleHandler, TRUE); SetConsoleCtrlHandler(ConsoleHandler, TRUE);
{ {

View File

@ -168,11 +168,13 @@ extern Scheme_Object *scheme_initialize(Scheme_Env *env);
/* ctl-C handler */ /* ctl-C handler */
/*========================================================================*/ /*========================================================================*/
#ifndef NO_USER_BREAK_HANDLER #if !defined(NO_USER_BREAK_HANDLER) || defined(DOS_FILE_SYSTEM)
static void *break_handle; static void *break_handle;
static void *signal_handle; static void *signal_handle;
# ifndef NO_USER_BREAK_HANDLER
static void user_break_hit(int ignore) static void user_break_hit(int ignore)
{ {
scheme_break_main_thread_at(break_handle); scheme_break_main_thread_at(break_handle);
@ -191,6 +193,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
/*========================================================================*/ /*========================================================================*/
/* main */ /* main */
/*========================================================================*/ /*========================================================================*/
@ -314,10 +327,15 @@ static int main_after_stack(void *data)
} }
#endif #endif
#ifndef NO_USER_BREAK_HANDLER #if !defined(NO_USER_BREAK_HANDLER) || defined(DOS_FILE_SYSTEM)
break_handle = scheme_get_main_thread_break_handle(); break_handle = scheme_get_main_thread_break_handle();
signal_handle = scheme_get_signal_handle(); signal_handle = scheme_get_signal_handle();
# ifndef NO_USER_BREAK_HANDLER
MZ_SIGSET(SIGINT, user_break_hit); MZ_SIGSET(SIGINT, user_break_hit);
# endif
# ifdef DOS_FILE_SYSTEM
SetConsoleCtrlHandler(ConsoleBreakHandler, TRUE);
# endif
#endif #endif
rval = run_from_cmd_line(argc, argv, scheme_basic_env, cont_run); rval = run_from_cmd_line(argc, argv, scheme_basic_env, cont_run);