]> gitweb.factorcode.org Git - factor.git/commitdiff
vm: update windows for resumable signals
authorJoe Groff <arcata@gmail.com>
Thu, 27 Oct 2011 01:24:00 +0000 (18:24 -0700)
committerJoe Groff <arcata@gmail.com>
Fri, 28 Oct 2011 04:18:21 +0000 (21:18 -0700)
Nmakefile
vm/errors.cpp
vm/os-unix.cpp
vm/os-windows.cpp
vm/vm.cpp
vm/vm.hpp

index c6f24da08a5182f4c494953adb1e263076c84514..293f0239e8b9dca7244e8181cd9613a7b13383b3 100755 (executable)
--- 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
index f61f8f5fd38a2ac4452109a03ed1ac2592af693d..bfe0ee91b14376ea68d8962ceed59d6256376e11 100755 (executable)
@@ -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)
index 65e9f0300cd90fa5618ce0a9b6480b2174a28233..49b2250a3de926f60118526d4b7b5cd28d52449d 100755 (executable)
@@ -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();
index 6743064c368a8b1c8830f13c1b239bcdb03b9a2d..19e5ed0ab888f937603521bf50af4716372aef41 100755 (executable)
@@ -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;
index 9476b33afde4bdb240e8b98634b40c21452ad01f..a629a24728b8ededf3c83bfa913c4e414580c539 100755 (executable)
--- 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();
 }
 
index 478f45792491dc58dabf7979095b1bb76dcadec6..b366f71ea824460bdd214c39bfc61183ce504563 100755 (executable)
--- 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__