]> gitweb.factorcode.org Git - factor.git/commitdiff
added lookup_vm and removed last usage of vm from windows code
authorPhil Dawes <phil@phildawes.net>
Mon, 24 Aug 2009 19:46:34 +0000 (20:46 +0100)
committerPhil Dawes <phil@phildawes.net>
Wed, 16 Sep 2009 07:20:09 +0000 (08:20 +0100)
vm/errors.cpp
vm/errors.hpp
vm/factor.cpp
vm/mach_signal.cpp
vm/os-unix.cpp
vm/os-unix.hpp
vm/os-windows-nt.cpp
vm/os-windows-nt.hpp
vm/vm.hpp

index 09b397dd0230b7a6aa2f3a1ab3dd10ee1d32a900..09e6313f29f5700a7565556acb01e8382fd6bb09 100755 (executable)
@@ -165,7 +165,7 @@ void factorvm::memory_signal_handler_impl()
 
 void memory_signal_handler_impl()
 {
-       return vm->memory_signal_handler_impl();
+       SIGNAL_VM_PTR->misc_signal_handler_impl();
 }
 
 void factorvm::misc_signal_handler_impl()
@@ -175,7 +175,7 @@ void factorvm::misc_signal_handler_impl()
 
 void misc_signal_handler_impl()
 {
-       vm->misc_signal_handler_impl();
+       SIGNAL_VM_PTR->misc_signal_handler_impl();
 }
 
 void factorvm::fp_signal_handler_impl()
@@ -185,7 +185,7 @@ void factorvm::fp_signal_handler_impl()
 
 void fp_signal_handler_impl()
 {
-       vm->fp_signal_handler_impl();
+       SIGNAL_VM_PTR->fp_signal_handler_impl();
 }
 
 }
index cc85cfd0a87e93795888e9478505a1c54c36bd96..8725941920a2a79b8695f0c3225a69d42a1c29b1 100755 (executable)
@@ -27,13 +27,6 @@ PRIMITIVE(die);
 PRIMITIVE(call_clear);
 PRIMITIVE(unimplemented);
 
-/* Global variables used to pass fault handler state from signal handler to
-user-space */
-extern cell signal_number;
-extern cell signal_fault_addr;
-extern unsigned int signal_fpu_status;
-extern stack_frame *signal_callstack_top;
-
 void memory_signal_handler_impl();
 void fp_signal_handler_impl();
 void misc_signal_handler_impl();
index 0c47e2329ae4b93697d705ef05fd1681220e760d..6e31a02cab7e9c561526f2b92afe1304977bbd3a 100755 (executable)
@@ -5,6 +5,19 @@ namespace factor
 
 factorvm *vm;
 
+unordered_map<long,factorvm*> thread_vms;
+
+factorvm *lookup_vm(long threadid)
+{
+       return thread_vms[threadid];
+}
+
+void register_vm(long threadid, factorvm *vm)
+{
+       thread_vms[threadid] = vm;
+}
+
+
 void factorvm::default_parameters(vm_parameters *p)
 {
        p->image_path = NULL;
@@ -199,6 +212,8 @@ void factorvm::factor_sleep(long us)
 
 void factorvm::start_standalone_factor(int argc, vm_char **argv)
 {
+       printf("thread id is %d\n",GetCurrentThreadId());fflush(stdout);
+       register_vm(GetCurrentThreadId(),this);
        vm_parameters p;
        default_parameters(&p);
        init_parameters_from_args(&p,argc,argv);
index 7b050f72dccb0ce2aabf39f2b60f6b03c00577ea..ca3b7aa1617a252cc2097df5071783be238d7597 100644 (file)
@@ -42,17 +42,17 @@ static void call_fault_handler(
 
        /* Are we in compiled Factor code? Then use the current stack pointer */
        if(vm->in_code_heap_p(MACH_PROGRAM_COUNTER(thread_state)))
-               signal_callstack_top = (stack_frame *)MACH_STACK_POINTER(thread_state);
+               vm->signal_callstack_top = (stack_frame *)MACH_STACK_POINTER(thread_state);
        /* Are we in C? Then use the saved callstack top */
        else
-               signal_callstack_top = NULL;
+               vm->signal_callstack_top = NULL;
 
        MACH_STACK_POINTER(thread_state) = fix_stack_pointer(MACH_STACK_POINTER(thread_state));
 
        /* Now we point the program counter at the right handler function. */
        if(exception == EXC_BAD_ACCESS)
        {
-               signal_fault_addr = MACH_EXC_STATE_FAULT(exc_state);
+               vm->signal_fault_addr = MACH_EXC_STATE_FAULT(exc_state);
                MACH_PROGRAM_COUNTER(thread_state) = (cell)memory_signal_handler_impl;
        }
        else if(exception == EXC_ARITHMETIC && code != MACH_EXC_INTEGER_DIV)
@@ -63,7 +63,7 @@ static void call_fault_handler(
        }
        else
        {
-               signal_number = (exception == EXC_ARITHMETIC ? SIGFPE : SIGABRT);
+               vm->signal_number = (exception == EXC_ARITHMETIC ? SIGFPE : SIGABRT);
                MACH_PROGRAM_COUNTER(thread_state) = (cell)misc_signal_handler_impl;
        }
 }
index 3cb72959962bfef2483b35a015942add1a4bc44c..97e1e0c04d0465854638c26331e96cd16d8a37a5 100644 (file)
@@ -120,15 +120,15 @@ static stack_frame *uap_stack_pointer(void *uap)
 
 void memory_signal_handler(int signal, siginfo_t *siginfo, void *uap)
 {
-       signal_fault_addr = (cell)siginfo->si_addr;
-       signal_callstack_top = uap_stack_pointer(uap);
+       vm->signal_fault_addr = (cell)siginfo->si_addr;
+       vm->signal_callstack_top = uap_stack_pointer(uap);
        UAP_PROGRAM_COUNTER(uap) = (cell)memory_signal_handler_impl;
 }
 
 void misc_signal_handler(int signal, siginfo_t *siginfo, void *uap)
 {
-       signal_number = signal;
-       signal_callstack_top = uap_stack_pointer(uap);
+       vm->signal_number = signal;
+       vm->signal_callstack_top = uap_stack_pointer(uap);
        UAP_PROGRAM_COUNTER(uap) = (cell)misc_signal_handler_impl;
 }
 
index 8aff18364e18bdefb5f0ac73bea5c82bc5022922..b7e528a4211dae8107ae1fa7372f15d19f76ad03 100644 (file)
@@ -58,4 +58,5 @@ void sleep_micros(cell usec);
 
 void open_console();
 
+#define SIGNAL_VM_PTR vm
 }
index 49594ed14a8d5c63235ce1047dcc9f966631a3f8..a4cdbc66af4b187f076ae5b445f6370a74ab8905 100755 (executable)
@@ -3,8 +3,8 @@
 namespace factor
 {
 
-void start_thread(void *(*start_routine)(void *),void *args){
-    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start_routine, args, 0, 0); 
+void *start_thread(void *(*start_routine)(void *),void *args){
+    return CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start_routine, args, 0, 0); 
 }
 
 
@@ -18,18 +18,19 @@ s64 factorvm::current_micros()
 
 FACTOR_STDCALL LONG exception_handler(PEXCEPTION_POINTERS pe)
 {
+       printf("exception handler %d\n",GetCurrentThreadId());
+       factorvm *myvm = lookup_vm(GetCurrentThreadId());
        PEXCEPTION_RECORD e = (PEXCEPTION_RECORD)pe->ExceptionRecord;
        CONTEXT *c = (CONTEXT*)pe->ContextRecord;
 
-       if(vm->in_code_heap_p(c->EIP))
-               signal_callstack_top = (stack_frame *)c->ESP;
+       if(myvm->in_code_heap_p(c->EIP))
+               myvm->signal_callstack_top = (stack_frame *)c->ESP;
        else
-               signal_callstack_top = NULL;
+               myvm->signal_callstack_top = NULL;
 
-       switch (e->ExceptionCode)
-       {
-       case EXCEPTION_ACCESS_VIOLATION:
-               signal_fault_addr = e->ExceptionInformation[1];
+    switch (e->ExceptionCode) {
+    case EXCEPTION_ACCESS_VIOLATION:
+               myvm->signal_fault_addr = e->ExceptionInformation[1];
                c->EIP = (cell)memory_signal_handler_impl;
        break;
 
@@ -42,7 +43,7 @@ FACTOR_STDCALL LONG exception_handler(PEXCEPTION_POINTERS pe)
        case STATUS_FLOAT_UNDERFLOW:
        case STATUS_FLOAT_MULTIPLE_FAULTS:
        case STATUS_FLOAT_MULTIPLE_TRAPS:
-               signal_fpu_status = fpu_status(X87SW(c) | MXCSR(c));
+               myvm->signal_fpu_status = fpu_status(X87SW(c) | MXCSR(c));
                X87SW(c) = 0;
                MXCSR(c) &= 0xffffffc0;
                c->EIP = (cell)fp_signal_handler_impl;
@@ -56,7 +57,7 @@ FACTOR_STDCALL LONG exception_handler(PEXCEPTION_POINTERS pe)
                enabled. Don't really have any idea what this exception means. */
                break;
        default:
-               signal_number = e->ExceptionCode;
+               myvm->signal_number = e->ExceptionCode;
                c->EIP = (cell)misc_signal_handler_impl;
                break;
        }
index 27923a000a077b91438c93a46135f63a64aba176..e5c5adadf111f24660caee548b48aa6d1db8454f 100755 (executable)
@@ -21,12 +21,13 @@ typedef char symbol_char;
 
 FACTOR_STDCALL LONG exception_handler(PEXCEPTION_POINTERS pe);
 
-
 // SSE traps raise these exception codes, which are defined in internal NT headers
 // but not winbase.h
 #define STATUS_FLOAT_MULTIPLE_FAULTS 0xC00002B4
 #define STATUS_FLOAT_MULTIPLE_TRAPS  0xC00002B5
 
-void start_thread(void *(*start_routine)(void *),void *args);
+void *start_thread(void *(*start_routine)(void *),void *args);
+
+#define SIGNAL_VM_PTR lookup_vm(GetCurrentThreadId())
 
 }
index 50006d012adaaa7cf6de97e694063173b33dc3bf..b3e40640b70e255e0d93413eead1ebc58e44c6b8 100644 (file)
--- a/vm/vm.hpp
+++ b/vm/vm.hpp
@@ -59,6 +59,12 @@ struct factorvm {
        inline void vmprim_profiling();
 
        // errors
+       /* Global variables used to pass fault handler state from signal handler to
+          user-space */
+       cell signal_number;
+       cell signal_fault_addr;
+       unsigned int signal_fpu_status;
+       stack_frame *signal_callstack_top;
        void out_of_memory();
        void fatal_error(const char* msg, cell tagged);
        void critical_error(const char* msg, cell tagged);
@@ -692,4 +698,6 @@ struct factorvm {
 
 extern factorvm *vm;
 
+extern factorvm *lookup_vm(long threadid);
+extern void register_vm(long threadid,factorvm *vm);
 }