From 9865417149b8fdafdf22fc0e96e09ba17de087f1 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Wed, 19 Oct 2011 18:54:49 -0700 Subject: [PATCH] vm: SetConsoleCtrlHandler on windows --- vm/os-windows.cpp | 26 ++++++++++++++++++++++++-- vm/vm.hpp | 1 + 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/vm/os-windows.cpp b/vm/os-windows.cpp index 3dc6da7863..b0ef3e3f93 100755 --- a/vm/os-windows.cpp +++ b/vm/os-windows.cpp @@ -248,7 +248,7 @@ LONG factor_vm::exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, break; default: signal_number = e->ExceptionCode; - c->EIP = (cell)factor::misc_signal_handler_impl; + c->EIP = (cell)factor::synchronous_signal_handler_impl; break; } @@ -260,6 +260,28 @@ VM_C_API LONG exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, vo return current_vm()->exception_handler(e,frame,c,dispatch); } -void factor_vm::open_console() {} +BOOL factor_vm::ctrl_handler(DWORD dwCtrlType) +{ + switch (dwCtrlType) { + case CTRL_C_EVENT: + case CTRL_BREAK_EVENT: + enqueue_safepoint_signal((cell)-1); + return TRUE; + default: + return FALSE; + } +} + +VM_C_API BOOL ctrl_handler(DWORD dwCtrlType) +{ + factor_vm *vm = current_vm_p(); + if (vm != NULL) + return vm->ctrl_handler(dwCtrlType); +} + +void factor_vm::open_console() +{ + SetConsoleCtrlHandler(ctrl_handler, TRUE); +} } diff --git a/vm/vm.hpp b/vm/vm.hpp index 447c300e9a..c1b535729f 100755 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -704,6 +704,7 @@ struct factor_vm #if defined(WINNT) void open_console(); LONG exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, void *dispatch); + BOOL ctrl_handler(DWORD dwCtrlType); #endif #else // UNIX