]> gitweb.factorcode.org Git - factor.git/commitdiff
thread_id is a pthread_t on unix
authorPhil Dawes <phil@phildawes.net>
Fri, 28 Aug 2009 20:46:47 +0000 (21:46 +0100)
committerPhil Dawes <phil@phildawes.net>
Wed, 16 Sep 2009 07:20:51 +0000 (08:20 +0100)
vm/factor.cpp
vm/factor.hpp
vm/main-unix.cpp
vm/main-windows-nt.cpp
vm/os-macosx.mm
vm/os-unix.cpp
vm/os-unix.hpp
vm/os-windows-nt.cpp
vm/os-windows-nt.hpp
vm/vm.hpp

index 741800f8d18438c86c940761dc8921f1b5f17fd9..4ef4d1179657d6e64cf9d16ae9a3e69ee9e83eb1 100755 (executable)
@@ -5,19 +5,11 @@ namespace factor
 
 factorvm *vm;
 
-unordered_map<long,factorvm*> thread_vms;
-
-factorvm *lookup_vm(unsigned long threadid)
+void init_globals()
 {
-       return thread_vms[threadid];
+       init_platform_globals();
 }
 
-void register_vm(unsigned long threadid, factorvm *thevm)
-{
-       thread_vms[threadid] = thevm;
-}
-
-
 void factorvm::default_parameters(vm_parameters *p)
 {
        p->image_path = NULL;
@@ -217,7 +209,6 @@ void factorvm::factor_sleep(long us)
 
 void factorvm::start_standalone_factor(int argc, vm_char **argv)
 {
-       register_vm(thread_id(),this);
        vm_parameters p;
        default_parameters(&p);
        init_parameters_from_args(&p,argc,argv);
@@ -234,6 +225,7 @@ struct startargs {
 void* start_standalone_factor_thread(void *arg) 
 {
        factorvm *newvm = new factorvm;
+       register_vm_with_thread(newvm);
        startargs *args = (startargs*) arg;
        newvm->start_standalone_factor(args->argc, args->argv);
        return 0;
@@ -244,6 +236,7 @@ VM_C_API void start_standalone_factor(int argc, vm_char **argv)
 {
        factorvm *newvm = new factorvm;
        vm = newvm;
+       register_vm_with_thread(newvm);
        return newvm->start_standalone_factor(argc,argv);
 }
 
index 46662072b57f1d308274604f862a68c86ac3a866..5f41c952e1a96baf67c655bad5df1b6f4d26aefd 100644 (file)
@@ -1,6 +1,8 @@
 namespace factor
 {
 
+VM_C_API void init_globals();
+
 VM_C_API void start_standalone_factor(int argc, vm_char **argv);
 VM_C_API THREADHANDLE start_standalone_factor_in_new_thread(int argc, vm_char **argv);
 }
index bc605e3cfdf4a4bd45f32bade4c53a10d50a80be..b8914e2bd33e94d64fd1161b0ab5305dbdfca405 100644 (file)
@@ -2,6 +2,7 @@
 
 int main(int argc, char **argv)
 {
+       factor::init_globals();
        factor::start_standalone_factor(argc,argv);
        return 0;
 }
index 2120717d867bc5d71df3217f3aeeac6cc2594395..df4a1172f1a8d41d2c8a9033e2cbff54e0648aee 100644 (file)
@@ -16,6 +16,7 @@ int WINAPI WinMain(
                return 1;
        }
 
+       factor::init_globals();
   #ifdef FACTOR_MULTITHREADED
        factor::THREADHANDLE thread = factor::start_standalone_factor_in_new_thread(nArgs,szArglist);
        WaitForSingleObject(thread, INFINITE);
index e4da7b2221031e0cf95b79f9323b52b8ad1e0749..7f692def0664daf08a316a002206a6862e772329 100644 (file)
@@ -5,7 +5,7 @@
 namespace factor
 {
 
-void c_to_factor_toplevel(cell quot)
+void factorvm::c_to_factor_toplevel(cell quot)
 {
        for(;;)
        {
index 4cee04a11bfc6ab82fdcd2f4ab0112f70b251aa6..7913647f3e3dcd1df81e35464e04fad82b78c080 100644 (file)
@@ -17,10 +17,26 @@ THREADHANDLE start_thread(void *(*start_routine)(void *),void *args)
        return thread;
 }
 
-unsigned long thread_id(){
-       return pthread_self();
+
+pthread_key_t tlsKey = 0;
+
+void init_platform_globals()
+{
+       if (pthread_key_create(&tlsKey, NULL) != 0){
+               fatal_error("pthread_key_create() failed",0);
+       }
+
 }
 
+void register_vm_with_thread(factorvm *vm)
+{
+       pthread_setspecific(tlsKey,vm);
+}
+
+factorvm *tls_vm()
+{
+       return (factorvm*)pthread_getspecific(tlsKey);
+}
 
 static void *null_dll;
 
index e3e207f641b2fa9e6f75ef4f6256b2709f8cdb88..5f84106f97899aee5ced6616d26d511cbbe11d6a 100644 (file)
@@ -45,7 +45,7 @@ typedef char symbol_char;
 typedef pthread_t THREADHANDLE;
 
 THREADHANDLE start_thread(void *(*start_routine)(void *),void *args);
-unsigned long thread_id();
+pthread_t thread_id();
 
 void unix_init_signals();
 void signal_handler(int signal, siginfo_t* siginfo, void* uap);
@@ -54,5 +54,9 @@ void dump_stack_signal(int signal, siginfo_t* siginfo, void* uap);
 s64 current_micros();
 void sleep_micros(cell usec);
 
+void init_platform_globals();
+struct factorvm;
+void register_vm_with_thread(factorvm *vm);
+factorvm *tls_vm();
 void open_console();
 }
index fbaadaaba7e2799d3080753cad85aff2739f56de..ee00e1434a893f15a7e16e69fbd87fbc99446a87 100755 (executable)
@@ -3,12 +3,31 @@
 namespace factor
 {
 
+
 THREADHANDLE start_thread(void *(*start_routine)(void *),void *args){
     return (void*) CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start_routine, args, 0, 0); 
 }
 
-unsigned long thread_id(){
-       return GetCurrentThreadId();
+
+DWORD dwTlsIndex; 
+
+void init_platform_globals()
+{
+       if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES) {
+               fatal_error("TlsAlloc failed - out of indexes",0);
+       }
+}
+
+void register_vm_with_thread(factorvm *vm)
+{
+       if (! TlsSetValue(dwTlsIndex, vm)) {
+               fatal_error("TlsSetValue failed",0);
+       }
+}
+
+factorvm *tls_vm()
+{
+       return (factorvm*)TlsGetValue(dwTlsIndex);
 }
 
 
@@ -22,7 +41,7 @@ s64 current_micros()
 
 FACTOR_STDCALL LONG exception_handler(PEXCEPTION_POINTERS pe)
 {
-       factorvm *myvm = lookup_vm(GetCurrentThreadId());
+       factorvm *myvm = SIGNAL_VM_PTR();
        PEXCEPTION_RECORD e = (PEXCEPTION_RECORD)pe->ExceptionRecord;
        CONTEXT *c = (CONTEXT*)pe->ContextRecord;
 
index 385553e11e1c81d135fb3ecba8a017d35d8a62ef..366348a898abecde06338f61ba9c7f8831afa122 100755 (executable)
@@ -29,6 +29,10 @@ FACTOR_STDCALL LONG exception_handler(PEXCEPTION_POINTERS pe);
 typedef HANDLE THREADHANDLE;
 
 THREADHANDLE start_thread(void *(*start_routine)(void *),void *args);
-unsigned long thread_id();
+
+void init_platform_globals();
+struct factorvm;
+void register_vm_with_thread(factorvm *vm);
+factorvm *tls_vm();
 
 }
index a16ff21121fc5e1fd024fa30e789107dbe5dbde0..b94ba16e003ec250f1f075b9fc55dfedc341b090 100644 (file)
--- a/vm/vm.hpp
+++ b/vm/vm.hpp
@@ -690,12 +690,11 @@ struct factorvm {
 };
 
 
-extern factorvm *lookup_vm(unsigned long threadid);
-extern void register_vm(unsigned long threadid,factorvm *vm);
+// #define FACTOR_SINGLE_THREADED_SINGLETON
+#define FACTOR_SINGLE_THREADED_TESTING
 
-#define FACTOR_SINGLE_THREADED
-
-#ifdef FACTOR_SINGLE_THREADED
+#ifdef FACTOR_SINGLE_THREADED_SINGLETON
+/* calls are dispatched using the singleton */
   extern factorvm *vm;
   #define PRIMITIVE_GETVM() vm
   #define PRIMITIVE_OVERFLOW_GETVM() vm
@@ -704,13 +703,14 @@ extern void register_vm(unsigned long threadid,factorvm *vm);
   #define SIGNAL_VM_PTR() vm
 #endif
 
-#ifdef FACTOR_TESTING_MULTITHREADED
+#ifdef FACTOR_SINGLE_THREADED_TESTING
+/* calls are dispatched as per multithreaded, but checked against singleton */
   extern factorvm *vm;
   #define PRIMITIVE_GETVM() ((factorvm*)myvm)
   #define PRIMITIVE_OVERFLOW_GETVM() vm
   #define VM_PTR myvm
   #define ASSERTVM() assert(vm==myvm)
-  #define SIGNAL_VM_PTR() lookup_vm(thread_id())
+  #define SIGNAL_VM_PTR() tls_vm()
 #endif
 
 #ifdef FACTOR_MULTITHREADED
@@ -718,7 +718,7 @@ extern void register_vm(unsigned long threadid,factorvm *vm);
   #define PRIMITIVE_OVERFLOW_GETVM() ((factorvm*)myvm)
   #define VM_PTR myvm
   #define ASSERTVM() 
-  #define SIGNAL_VM_PTR() lookup_vm(thread_id())
+  #define SIGNAL_VM_PTR() tls_vm()
 #endif
 
 }