vm: update windows for resumable signals
parent
9541bf14f5
commit
6d57eb4f59
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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__
|
||||
|
|
Loading…
Reference in New Issue