cleaned up code a bit, added multithreaded mode flags

Phil Dawes 2009-08-25 18:17:14 +01:00
parent 9b013faed4
commit 05d17492ed
8 changed files with 47 additions and 18 deletions

View File

@ -12,9 +12,9 @@ factorvm *lookup_vm(unsigned long threadid)
return thread_vms[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;
} }

View File

@ -2,6 +2,11 @@
int main(int argc, char **argv) int main(int argc, char **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); factor::start_standalone_factor(argc,argv);
#endif
return 0; return 0;
} }

View File

@ -16,9 +16,12 @@ int WINAPI WinMain(
return 1; 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); factor::start_standalone_factor(nArgs,szArglist);
//HANDLE thread = factor::start_standalone_factor_in_new_thread(nArgs,szArglist); #endif
//WaitForSingleObject(thread, INFINITE);
LocalFree(szArglist); LocalFree(szArglist);

View File

@ -55,6 +55,4 @@ s64 current_micros();
void sleep_micros(cell usec); void sleep_micros(cell usec);
void open_console(); void open_console();
#define SIGNAL_VM_PTR vm
} }

View File

@ -31,6 +31,4 @@ typedef HANDLE THREADHANDLE;
THREADHANDLE start_thread(void *(*start_routine)(void *),void *args); THREADHANDLE start_thread(void *(*start_routine)(void *),void *args);
unsigned long thread_id(); unsigned long thread_id();
#define SIGNAL_VM_PTR lookup_vm(GetCurrentThreadId())
} }

View File

@ -4,15 +4,10 @@ namespace factor
#if defined(FACTOR_X86) #if defined(FACTOR_X86)
extern "C" __attribute__ ((regparm (1))) typedef void (*primitive_type)(void *myvm); 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(name) extern "C" __attribute__ ((regparm (1))) void primitive_##name(void *myvm)
#define PRIMITIVE_GETVM() ((factorvm*)myvm)
#else #else
extern "C" typedef void (*primitive_type)(void *myvm); extern "C" typedef void (*primitive_type)(void *myvm);
#define PRIMITIVE(name) extern "C" void primitive_##name(void *myvm) #define PRIMITIVE(name) extern "C" void primitive_##name(void *myvm)
#define PRIMITIVE_GETVM() vm
#endif #endif
extern const primitive_type primitives[]; extern const primitive_type primitives[];
#define PRIMITIVE_OVERFLOW_GETVM() vm
#define VM_PTR vm
#define ASSERTVM()
} }

View File

@ -37,13 +37,13 @@ struct tagged
explicit tagged(cell tagged) : value_(tagged) { explicit tagged(cell tagged) : value_(tagged) {
#ifdef FACTOR_DEBUG #ifdef FACTOR_DEBUG
untag_check(vm); untag_check(SIGNAL_VM_PTR);
#endif #endif
} }
explicit tagged(TYPE *untagged) : value_(factor::tag(untagged)) { explicit tagged(TYPE *untagged) : value_(factor::tag(untagged)) {
#ifdef FACTOR_DEBUG #ifdef FACTOR_DEBUG
untag_check(vm); untag_check(SIGNAL_VM_PTR);
#endif #endif
} }

View File

@ -677,17 +677,47 @@ struct factorvm {
bool windows_stat(vm_char *path); bool windows_stat(vm_char *path);
#if defined(WINNT) #if defined(WINNT)
void c_to_factor_toplevel(cell quot);
void open_console(); void open_console();
// next method here: // next method here:
#endif #endif
#else // UNIX
stack_frame *uap_stack_pointer(void *uap);
#endif #endif
}; };
extern factorvm *vm;
extern factorvm *lookup_vm(unsigned long threadid); extern factorvm *lookup_vm(unsigned long threadid);
extern void register_vm(unsigned long threadid,factorvm *vm); 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
} }