From fa6d8d239bbf79ffc636de494edce2d5b2a3a859 Mon Sep 17 00:00:00 2001 From: Phil Dawes Date: Tue, 25 Aug 2009 18:08:45 +0100 Subject: [PATCH] removed vm singleton usage from unix stuff --- vm/os-genunix.cpp | 4 ++-- vm/os-unix.cpp | 18 ++++++++++-------- vm/vm.hpp | 1 + 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/vm/os-genunix.cpp b/vm/os-genunix.cpp index 29c3e79859..6540d8d196 100644 --- a/vm/os-genunix.cpp +++ b/vm/os-genunix.cpp @@ -3,9 +3,9 @@ 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() diff --git a/vm/os-unix.cpp b/vm/os-unix.cpp index 7f4b070c60..268469a875 100644 --- a/vm/os-unix.cpp +++ b/vm/os-unix.cpp @@ -9,7 +9,7 @@ THREADHANDLE start_thread(void *(*start_routine)(void *),void *args) pthread_t thread; if (pthread_attr_init (&attr) != 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); if (pthread_create (&thread, &attr, start_routine, args) != 0) fatal_error("pthread_create() failed",0); @@ -114,17 +114,17 @@ void dealloc_segment(segment *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 delivered during stack frame setup/teardown or while transitioning from Factor to C is a sign of things seriously gone wrong, not just 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); if(!ptr) - vm->critical_error("Invalid uap",(cell)uap); + critical_error("Invalid uap",(cell)uap); return ptr; } else @@ -133,15 +133,17 @@ static stack_frame *uap_stack_pointer(void *uap) void memory_signal_handler(int signal, siginfo_t *siginfo, void *uap) { - vm->signal_fault_addr = (cell)siginfo->si_addr; - vm->signal_callstack_top = uap_stack_pointer(uap); + factorvm *myvm = lookup_vm(thread_id()); + 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; } void misc_signal_handler(int signal, siginfo_t *siginfo, void *uap) { - vm->signal_number = signal; - vm->signal_callstack_top = uap_stack_pointer(uap); + factorvm *myvm = lookup_vm(thread_id()); + myvm->signal_number = signal; + myvm->signal_callstack_top = myvm->uap_stack_pointer(uap); UAP_PROGRAM_COUNTER(uap) = (cell)misc_signal_handler_impl; } diff --git a/vm/vm.hpp b/vm/vm.hpp index 76cf8c4e53..65e41881cb 100644 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -664,6 +664,7 @@ struct factorvm { void *ffi_dlsym(dll *dll, symbol_char *symbol); void ffi_dlclose(dll *dll); segment *alloc_segment(cell size); + void c_to_factor_toplevel(cell quot); // os-windows #if defined(WINDOWS) -- 2.34.1