thread_id is a pthread_t on unix
parent
d76af35ecf
commit
a8f233c055
|
@ -5,19 +5,11 @@ namespace factor
|
||||||
|
|
||||||
factorvm *vm;
|
factorvm *vm;
|
||||||
|
|
||||||
unordered_map<long,factorvm*> thread_vms;
|
void init_globals()
|
||||||
|
|
||||||
factorvm *lookup_vm(unsigned long threadid)
|
|
||||||
{
|
{
|
||||||
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)
|
void factorvm::default_parameters(vm_parameters *p)
|
||||||
{
|
{
|
||||||
p->image_path = NULL;
|
p->image_path = NULL;
|
||||||
|
@ -217,7 +209,6 @@ void factorvm::factor_sleep(long us)
|
||||||
|
|
||||||
void factorvm::start_standalone_factor(int argc, vm_char **argv)
|
void factorvm::start_standalone_factor(int argc, vm_char **argv)
|
||||||
{
|
{
|
||||||
register_vm(thread_id(),this);
|
|
||||||
vm_parameters p;
|
vm_parameters p;
|
||||||
default_parameters(&p);
|
default_parameters(&p);
|
||||||
init_parameters_from_args(&p,argc,argv);
|
init_parameters_from_args(&p,argc,argv);
|
||||||
|
@ -234,6 +225,7 @@ struct startargs {
|
||||||
void* start_standalone_factor_thread(void *arg)
|
void* start_standalone_factor_thread(void *arg)
|
||||||
{
|
{
|
||||||
factorvm *newvm = new factorvm;
|
factorvm *newvm = new factorvm;
|
||||||
|
register_vm_with_thread(newvm);
|
||||||
startargs *args = (startargs*) arg;
|
startargs *args = (startargs*) arg;
|
||||||
newvm->start_standalone_factor(args->argc, args->argv);
|
newvm->start_standalone_factor(args->argc, args->argv);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -244,6 +236,7 @@ VM_C_API void start_standalone_factor(int argc, vm_char **argv)
|
||||||
{
|
{
|
||||||
factorvm *newvm = new factorvm;
|
factorvm *newvm = new factorvm;
|
||||||
vm = newvm;
|
vm = newvm;
|
||||||
|
register_vm_with_thread(newvm);
|
||||||
return newvm->start_standalone_factor(argc,argv);
|
return newvm->start_standalone_factor(argc,argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
namespace factor
|
namespace factor
|
||||||
{
|
{
|
||||||
|
|
||||||
|
VM_C_API void init_globals();
|
||||||
|
|
||||||
VM_C_API void start_standalone_factor(int argc, vm_char **argv);
|
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);
|
VM_C_API THREADHANDLE start_standalone_factor_in_new_thread(int argc, vm_char **argv);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
factor::init_globals();
|
||||||
factor::start_standalone_factor(argc,argv);
|
factor::start_standalone_factor(argc,argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ int WINAPI WinMain(
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
factor::init_globals();
|
||||||
#ifdef FACTOR_MULTITHREADED
|
#ifdef FACTOR_MULTITHREADED
|
||||||
factor::THREADHANDLE thread = factor::start_standalone_factor_in_new_thread(nArgs,szArglist);
|
factor::THREADHANDLE thread = factor::start_standalone_factor_in_new_thread(nArgs,szArglist);
|
||||||
WaitForSingleObject(thread, INFINITE);
|
WaitForSingleObject(thread, INFINITE);
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
namespace factor
|
namespace factor
|
||||||
{
|
{
|
||||||
|
|
||||||
void c_to_factor_toplevel(cell quot)
|
void factorvm::c_to_factor_toplevel(cell quot)
|
||||||
{
|
{
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
|
|
|
@ -17,10 +17,26 @@ THREADHANDLE start_thread(void *(*start_routine)(void *),void *args)
|
||||||
return thread;
|
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;
|
static void *null_dll;
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ typedef char symbol_char;
|
||||||
typedef pthread_t THREADHANDLE;
|
typedef pthread_t THREADHANDLE;
|
||||||
|
|
||||||
THREADHANDLE start_thread(void *(*start_routine)(void *),void *args);
|
THREADHANDLE start_thread(void *(*start_routine)(void *),void *args);
|
||||||
unsigned long thread_id();
|
pthread_t thread_id();
|
||||||
|
|
||||||
void unix_init_signals();
|
void unix_init_signals();
|
||||||
void signal_handler(int signal, siginfo_t* siginfo, void* uap);
|
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();
|
s64 current_micros();
|
||||||
void sleep_micros(cell usec);
|
void sleep_micros(cell usec);
|
||||||
|
|
||||||
|
void init_platform_globals();
|
||||||
|
struct factorvm;
|
||||||
|
void register_vm_with_thread(factorvm *vm);
|
||||||
|
factorvm *tls_vm();
|
||||||
void open_console();
|
void open_console();
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,12 +3,31 @@
|
||||||
namespace factor
|
namespace factor
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
THREADHANDLE start_thread(void *(*start_routine)(void *),void *args){
|
THREADHANDLE start_thread(void *(*start_routine)(void *),void *args){
|
||||||
return (void*) CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start_routine, args, 0, 0);
|
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)
|
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;
|
PEXCEPTION_RECORD e = (PEXCEPTION_RECORD)pe->ExceptionRecord;
|
||||||
CONTEXT *c = (CONTEXT*)pe->ContextRecord;
|
CONTEXT *c = (CONTEXT*)pe->ContextRecord;
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,10 @@ FACTOR_STDCALL LONG exception_handler(PEXCEPTION_POINTERS pe);
|
||||||
typedef HANDLE THREADHANDLE;
|
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();
|
|
||||||
|
void init_platform_globals();
|
||||||
|
struct factorvm;
|
||||||
|
void register_vm_with_thread(factorvm *vm);
|
||||||
|
factorvm *tls_vm();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
16
vm/vm.hpp
16
vm/vm.hpp
|
@ -690,12 +690,11 @@ struct factorvm {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
extern factorvm *lookup_vm(unsigned long threadid);
|
// #define FACTOR_SINGLE_THREADED_SINGLETON
|
||||||
extern void register_vm(unsigned long threadid,factorvm *vm);
|
#define FACTOR_SINGLE_THREADED_TESTING
|
||||||
|
|
||||||
#define FACTOR_SINGLE_THREADED
|
#ifdef FACTOR_SINGLE_THREADED_SINGLETON
|
||||||
|
/* calls are dispatched using the singleton */
|
||||||
#ifdef FACTOR_SINGLE_THREADED
|
|
||||||
extern factorvm *vm;
|
extern factorvm *vm;
|
||||||
#define PRIMITIVE_GETVM() vm
|
#define PRIMITIVE_GETVM() vm
|
||||||
#define PRIMITIVE_OVERFLOW_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
|
#define SIGNAL_VM_PTR() vm
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FACTOR_TESTING_MULTITHREADED
|
#ifdef FACTOR_SINGLE_THREADED_TESTING
|
||||||
|
/* calls are dispatched as per multithreaded, but checked against singleton */
|
||||||
extern factorvm *vm;
|
extern factorvm *vm;
|
||||||
#define PRIMITIVE_GETVM() ((factorvm*)myvm)
|
#define PRIMITIVE_GETVM() ((factorvm*)myvm)
|
||||||
#define PRIMITIVE_OVERFLOW_GETVM() vm
|
#define PRIMITIVE_OVERFLOW_GETVM() vm
|
||||||
#define VM_PTR myvm
|
#define VM_PTR myvm
|
||||||
#define ASSERTVM() assert(vm==myvm)
|
#define ASSERTVM() assert(vm==myvm)
|
||||||
#define SIGNAL_VM_PTR() lookup_vm(thread_id())
|
#define SIGNAL_VM_PTR() tls_vm()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FACTOR_MULTITHREADED
|
#ifdef FACTOR_MULTITHREADED
|
||||||
|
@ -718,7 +718,7 @@ extern void register_vm(unsigned long threadid,factorvm *vm);
|
||||||
#define PRIMITIVE_OVERFLOW_GETVM() ((factorvm*)myvm)
|
#define PRIMITIVE_OVERFLOW_GETVM() ((factorvm*)myvm)
|
||||||
#define VM_PTR myvm
|
#define VM_PTR myvm
|
||||||
#define ASSERTVM()
|
#define ASSERTVM()
|
||||||
#define SIGNAL_VM_PTR() lookup_vm(thread_id())
|
#define SIGNAL_VM_PTR() tls_vm()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue