From: Joe Groff Date: Thu, 27 Oct 2011 01:24:00 +0000 (-0700) Subject: vm: update windows for resumable signals X-Git-Tag: 0.97~3711 X-Git-Url: https://gitweb.factorcode.org/gitweb.cgi?p=factor.git;a=commitdiff_plain;h=6d57eb4f5916ef13e4e3199ed8736de4274d8b64 vm: update windows for resumable signals --- diff --git a/Nmakefile b/Nmakefile index c6f24da08a..293f0239e8 100755 --- a/Nmakefile +++ b/Nmakefile @@ -14,9 +14,9 @@ CL_FLAGS = $(CL_FLAGS) /Zi /DFACTOR_DEBUG !IF "$(PLATFORM)" == "x86-32" LINK_FLAGS = $(LINK_FLAGS) /safeseh -PLAF_DLL_OBJS = vm\os-windows-x86.32.obj vm\safeseh.obj +PLAF_DLL_OBJS = vm\os-windows-x86.32.obj vm\safeseh.obj vm\cpu-x86.obj !ELSEIF "$(PLATFORM)" == "x86-64" -PLAF_DLL_OBJS = vm\os-windows-x86.64.obj +PLAF_DLL_OBJS = vm\os-windows-x86.64.obj vm\cpu-x86.obj !ENDIF ML_FLAGS = /nologo /safeseh diff --git a/vm/errors.cpp b/vm/errors.cpp index f61f8f5fd3..bfe0ee91b1 100755 --- a/vm/errors.cpp +++ b/vm/errors.cpp @@ -170,12 +170,6 @@ void factor_vm::enqueue_safepoint_fep() code->guard_safepoint(); } -void factor_vm::enqueue_safepoint_signal(cell signal) -{ - sigaddset(&safepoint_signals, signal); - code->guard_safepoint(); -} - void factor_vm::enqueue_safepoint_sample() { if (!sampling_p) diff --git a/vm/os-unix.cpp b/vm/os-unix.cpp index 65e9f0300c..49b2250a3d 100755 --- a/vm/os-unix.cpp +++ b/vm/os-unix.cpp @@ -146,6 +146,12 @@ void factor_vm::dispatch_signal(void *uap, void (handler)()) UAP_SET_TOC_POINTER(uap, (cell)FUNCTION_TOC_POINTER(handler)); } +void factor_vm::enqueue_safepoint_signal(cell signal) +{ + sigaddset(&safepoint_signals, signal); + code->guard_safepoint(); +} + void memory_signal_handler(int signal, siginfo_t *siginfo, void *uap) { factor_vm *vm = current_vm(); diff --git a/vm/os-windows.cpp b/vm/os-windows.cpp index 6743064c36..19e5ed0ab8 100755 --- a/vm/os-windows.cpp +++ b/vm/os-windows.cpp @@ -216,14 +216,15 @@ void sleep_nanos(u64 nsec) LONG factor_vm::exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, void *dispatch) { - c->ESP = (cell)fix_callstack_top((stack_frame *)c->ESP); - ctx->callstack_top = (stack_frame *)c->ESP; - switch (e->ExceptionCode) { case EXCEPTION_ACCESS_VIOLATION: signal_fault_addr = e->ExceptionInformation[1]; - c->EIP = (cell)factor::memory_signal_handler_impl; + dispatch_signal_handler( + (cell*)&c->ESP, + (cell*)&c->EIP, + (cell)factor::memory_signal_handler_impl + ); break; case STATUS_FLOAT_DENORMAL_OPERAND: @@ -244,11 +245,19 @@ LONG factor_vm::exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, X87SW(c) = 0; #endif MXCSR(c) &= 0xffffffc0; - c->EIP = (cell)factor::fp_signal_handler_impl; + dispatch_signal_handler( + (cell*)&c->ESP, + (cell*)&c->EIP, + (cell)factor::fp_signal_handler_impl + ); break; default: signal_number = e->ExceptionCode; - c->EIP = (cell)factor::synchronous_signal_handler_impl; + dispatch_signal_handler( + (cell*)&c->ESP, + (cell*)&c->EIP, + (cell)factor::synchronous_signal_handler_impl + ); break; } @@ -265,7 +274,7 @@ BOOL factor_vm::ctrl_handler(DWORD dwCtrlType) switch (dwCtrlType) { case CTRL_C_EVENT: case CTRL_BREAK_EVENT: - enqueue_safepoint_signal((cell)-1); + enqueue_safepoint_fep(); return TRUE; default: return FALSE; diff --git a/vm/vm.cpp b/vm/vm.cpp index 9476b33afd..a629a24728 100755 --- a/vm/vm.cpp +++ b/vm/vm.cpp @@ -20,7 +20,9 @@ factor_vm::factor_vm() : last_nano_count(0), signal_callstack_seg(NULL) { +#ifndef WINDOWS sigemptyset(&safepoint_signals); +#endif primitive_reset_dispatch_stats(); } diff --git a/vm/vm.hpp b/vm/vm.hpp index 478f457924..b366f71ea8 100755 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -73,7 +73,6 @@ struct factor_vm unsigned int signal_fpu_status; bool safepoint_fep; cell safepoint_sample_count; - sigset_t safepoint_signals; /* GC is off during heap walking */ bool gc_off; @@ -201,7 +200,6 @@ struct factor_vm void fp_signal_handler_impl(); void enqueue_safepoint_fep(); void enqueue_safepoint_sample(); - void enqueue_safepoint_signal(cell signal); void handle_safepoint(); // bignum @@ -720,15 +718,15 @@ struct factor_vm void windows_image_path(vm_char *full_path, vm_char *temp_path, unsigned int length); BOOL windows_stat(vm_char *path); - #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 void dispatch_signal(void *uap, void (handler)()); + void enqueue_safepoint_signal(cell signal); void unix_init_signals(); + sigset_t safepoint_signals; #endif #ifdef __APPLE__