vm: update windows for resumable signals

db4
Joe Groff 2011-10-26 18:24:00 -07:00
parent 9541bf14f5
commit 6d57eb4f59
6 changed files with 28 additions and 19 deletions

View File

@ -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

View File

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

View File

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

View File

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

View File

@ -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();
}

View File

@ -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__