cleaned up code a bit, added multithreaded mode flags

db4
Phil Dawes 2009-08-25 18:17:14 +01:00
parent fa6d8d239b
commit ca16daa4b2
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];
}
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)
{
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;
}

View 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);

View File

@ -55,6 +55,4 @@ s64 current_micros();
void sleep_micros(cell usec);
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);
unsigned long thread_id();
#define SIGNAL_VM_PTR lookup_vm(GetCurrentThreadId())
}

View 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()
}

View File

@ -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
}

View File

@ -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
}