]> gitweb.factorcode.org Git - factor.git/commitdiff
removed vm singleton usage from unix stuff
authorPhil Dawes <phil@phildawes.net>
Tue, 25 Aug 2009 17:08:45 +0000 (18:08 +0100)
committerPhil Dawes <phil@phildawes.net>
Wed, 16 Sep 2009 07:20:49 +0000 (08:20 +0100)
vm/os-genunix.cpp
vm/os-unix.cpp
vm/vm.hpp

index 29c3e79859dbada3061adc2cc053b200a22408e5..6540d8d19613bf5d6bb8feeb1af3a383ad66c897 100644 (file)
@@ -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()
index 7f4b070c60e3f2866c05aa558b358523d90913eb..268469a8753b6d1d0350577c534d7c9ff58d76da 100644 (file)
@@ -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;
 }
 
index 76cf8c4e53819a8f5475599c75f169008b5fd445..65e41881cb26526311653a3a934cd7a288596972 100644 (file)
--- 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)