removed vm singleton usage from unix stuff

Phil Dawes 2009-08-25 18:08:45 +01:00
parent 1e93c766a1
commit 9b013faed4
3 changed files with 13 additions and 10 deletions

View File

@ -3,9 +3,9 @@
namespace factor namespace factor
{ {
void c_to_factor_toplevel(cell quot) void factorvm::c_to_factor_toplevel(cell quot)
{ {
c_to_factor(quot,vm); c_to_factor(quot,this);
} }
void init_signals() void init_signals()

View File

@ -9,7 +9,7 @@ THREADHANDLE start_thread(void *(*start_routine)(void *),void *args)
pthread_t thread; pthread_t thread;
if (pthread_attr_init (&attr) != 0) if (pthread_attr_init (&attr) != 0)
fatal_error("pthread_attr_init() failed",0); fatal_error("pthread_attr_init() failed",0);
if (pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) != 0) if (pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_JOINABLE) != 0)
fatal_error("pthread_attr_setdetachstate() failed",0); fatal_error("pthread_attr_setdetachstate() failed",0);
if (pthread_create (&thread, &attr, start_routine, args) != 0) if (pthread_create (&thread, &attr, start_routine, args) != 0)
fatal_error("pthread_create() failed",0); fatal_error("pthread_create() failed",0);
@ -114,17 +114,17 @@ void dealloc_segment(segment *block)
free(block); free(block);
} }
static stack_frame *uap_stack_pointer(void *uap) stack_frame *factorvm::uap_stack_pointer(void *uap)
{ {
/* There is a race condition here, but in practice a signal /* There is a race condition here, but in practice a signal
delivered during stack frame setup/teardown or while transitioning delivered during stack frame setup/teardown or while transitioning
from Factor to C is a sign of things seriously gone wrong, not just from Factor to C is a sign of things seriously gone wrong, not just
a divide by zero or stack underflow in the listener */ a divide by zero or stack underflow in the listener */
if(vm->in_code_heap_p(UAP_PROGRAM_COUNTER(uap))) if(in_code_heap_p(UAP_PROGRAM_COUNTER(uap)))
{ {
stack_frame *ptr = (stack_frame *)ucontext_stack_pointer(uap); stack_frame *ptr = (stack_frame *)ucontext_stack_pointer(uap);
if(!ptr) if(!ptr)
vm->critical_error("Invalid uap",(cell)uap); critical_error("Invalid uap",(cell)uap);
return ptr; return ptr;
} }
else else
@ -133,15 +133,17 @@ static stack_frame *uap_stack_pointer(void *uap)
void memory_signal_handler(int signal, siginfo_t *siginfo, void *uap) void memory_signal_handler(int signal, siginfo_t *siginfo, void *uap)
{ {
vm->signal_fault_addr = (cell)siginfo->si_addr; factorvm *myvm = lookup_vm(thread_id());
vm->signal_callstack_top = uap_stack_pointer(uap); myvm->signal_fault_addr = (cell)siginfo->si_addr;
myvm->signal_callstack_top = myvm->uap_stack_pointer(uap);
UAP_PROGRAM_COUNTER(uap) = (cell)memory_signal_handler_impl; UAP_PROGRAM_COUNTER(uap) = (cell)memory_signal_handler_impl;
} }
void misc_signal_handler(int signal, siginfo_t *siginfo, void *uap) void misc_signal_handler(int signal, siginfo_t *siginfo, void *uap)
{ {
vm->signal_number = signal; factorvm *myvm = lookup_vm(thread_id());
vm->signal_callstack_top = uap_stack_pointer(uap); myvm->signal_number = signal;
myvm->signal_callstack_top = myvm->uap_stack_pointer(uap);
UAP_PROGRAM_COUNTER(uap) = (cell)misc_signal_handler_impl; UAP_PROGRAM_COUNTER(uap) = (cell)misc_signal_handler_impl;
} }

View File

@ -664,6 +664,7 @@ struct factorvm {
void *ffi_dlsym(dll *dll, symbol_char *symbol); void *ffi_dlsym(dll *dll, symbol_char *symbol);
void ffi_dlclose(dll *dll); void ffi_dlclose(dll *dll);
segment *alloc_segment(cell size); segment *alloc_segment(cell size);
void c_to_factor_toplevel(cell quot);
// os-windows // os-windows
#if defined(WINDOWS) #if defined(WINDOWS)