]> gitweb.factorcode.org Git - factor.git/commitdiff
cleaned up code a bit, added multithreaded mode flags
authorPhil Dawes <phil@phildawes.net>
Tue, 25 Aug 2009 17:17:14 +0000 (18:17 +0100)
committerPhil Dawes <phil@phildawes.net>
Wed, 16 Sep 2009 07:20:50 +0000 (08:20 +0100)
vm/factor.cpp
vm/main-unix.cpp
vm/main-windows-nt.cpp
vm/os-unix.hpp
vm/os-windows-nt.hpp
vm/primitives.hpp
vm/tagged.hpp
vm/vm.hpp

index 57bceb9cb7042f79961b121a23c0c5092da1277c..026453eae344a89b42f7139558dfb9846b3d00f7 100755 (executable)
@@ -12,9 +12,9 @@ factorvm *lookup_vm(unsigned long threadid)
        return thread_vms[threadid];
 }
 
-void register_vm(unsigned long threadid, factorvm *vm)
+void register_vm(unsigned long threadid, factorvm *thevm)
 {
-       thread_vms[threadid] = vm;
+       thread_vms[threadid] = thevm;
 }
 
 
index bc605e3cfdf4a4bd45f32bade4c53a10d50a80be..bd1549a38ebb8656b868c5fa30683173c6d443a8 100644 (file)
@@ -2,6 +2,11 @@
 
 int main(int argc, char **argv)
 {
-       factor::start_standalone_factor(argc,argv);
+       #ifdef FACTOR_MULTITHREADED
+         factor::THREADHANDLE thread = factor::start_standalone_factor_in_new_thread(argc,argv);
+         pthread_join(thread,NULL);
+    #else
+         factor::start_standalone_factor(argc,argv);
+       #endif
        return 0;
 }
index 4a0fc2ae35b4515cc91170a1d905471fd82da506..2120717d867bc5d71df3217f3aeeac6cc2594395 100644 (file)
@@ -16,9 +16,12 @@ int WINAPI WinMain(
                return 1;
        }
 
+  #ifdef FACTOR_MULTITHREADED
+       factor::THREADHANDLE thread = factor::start_standalone_factor_in_new_thread(nArgs,szArglist);
+       WaitForSingleObject(thread, INFINITE);
+  #else
        factor::start_standalone_factor(nArgs,szArglist);
-       //HANDLE thread = factor::start_standalone_factor_in_new_thread(nArgs,szArglist);
-       //WaitForSingleObject(thread, INFINITE);
+  #endif
 
        LocalFree(szArglist);
 
index b37d2beeeae19d734cdd19f7acf0cbbe145dbcb2..e3e207f641b2fa9e6f75ef4f6256b2709f8cdb88 100644 (file)
@@ -55,6 +55,4 @@ s64 current_micros();
 void sleep_micros(cell usec);
 
 void open_console();
-
-#define SIGNAL_VM_PTR vm
 }
index 68de8ff49e06908ac70bbc53451694434c587209..385553e11e1c81d135fb3ecba8a017d35d8a62ef 100755 (executable)
@@ -31,6 +31,4 @@ typedef HANDLE THREADHANDLE;
 THREADHANDLE start_thread(void *(*start_routine)(void *),void *args);
 unsigned long thread_id();
 
-#define SIGNAL_VM_PTR lookup_vm(GetCurrentThreadId())
-
 }
index 8e6c3b8f518dec1aafe2f9f46138b4b4c54deb96..4be190d4e6b6118d414fb96fe865c406ab998927 100644 (file)
@@ -4,15 +4,10 @@ namespace factor
 #if defined(FACTOR_X86)
   extern "C" __attribute__ ((regparm (1))) typedef void (*primitive_type)(void *myvm);
   #define PRIMITIVE(name) extern "C" __attribute__ ((regparm (1)))  void primitive_##name(void *myvm)
-  #define PRIMITIVE_GETVM() ((factorvm*)myvm)
 #else
   extern "C" typedef void (*primitive_type)(void *myvm);
   #define PRIMITIVE(name) extern "C" void primitive_##name(void *myvm)
-  #define PRIMITIVE_GETVM() vm
 #endif
 
 extern const primitive_type primitives[];
-#define PRIMITIVE_OVERFLOW_GETVM() vm
-#define VM_PTR vm
-#define ASSERTVM() 
 }
index 2bf058212f70c20018224e409d64d550c32047f2..13ddf4a0474c47312c96d057cbabb1cffde7fb35 100755 (executable)
@@ -37,13 +37,13 @@ struct tagged
 
        explicit tagged(cell tagged) : value_(tagged) {
 #ifdef FACTOR_DEBUG
-               untag_check(vm);
+               untag_check(SIGNAL_VM_PTR);
 #endif
        }
 
        explicit tagged(TYPE *untagged) : value_(factor::tag(untagged)) {
 #ifdef FACTOR_DEBUG
-               untag_check(vm);
+               untag_check(SIGNAL_VM_PTR); 
 #endif
        }
 
index 65e41881cb26526311653a3a934cd7a288596972..35011171eeb9f6aebaa32b7fc701292d0b91556c 100644 (file)
--- a/vm/vm.hpp
+++ b/vm/vm.hpp
@@ -677,17 +677,47 @@ struct factorvm {
        bool windows_stat(vm_char *path);
        
    #if defined(WINNT)
-       void c_to_factor_toplevel(cell quot);
        void open_console();
        // next method here:    
    #endif
+  #else  // UNIX
+
+       stack_frame *uap_stack_pointer(void *uap);
 
   #endif
 
 };
 
-extern factorvm *vm;
 
 extern factorvm *lookup_vm(unsigned long threadid);
 extern void register_vm(unsigned long threadid,factorvm *vm);
+
+#define FACTOR_SINGLE_THREADED
+
+#ifdef FACTOR_SINGLE_THREADED
+  extern factorvm *vm;
+  #define PRIMITIVE_GETVM() vm
+  #define PRIMITIVE_OVERFLOW_GETVM() vm
+  #define VM_PTR vm
+  #define ASSERTVM() 
+  #define SIGNAL_VM_PTR vm
+#endif
+
+#ifdef FACTOR_TESTING_MULTITHREADED
+  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())
+#endif
+
+#ifdef FACTOR_MULTITHREADED
+  #define PRIMITIVE_GETVM() ((factorvm*)myvm)
+  #define PRIMITIVE_OVERFLOW_GETVM() ((factorvm*)myvm)
+  #define VM_PTR myvm
+  #define ASSERTVM() 
+  #define SIGNAL_VM_PTR lookup_vm(thread_id())
+#endif
+
 }