thread_id is a pthread_t on unix

db4
Phil Dawes 2009-08-28 21:46:47 +01:00
parent b1c68d92b7
commit f4af39b60e
10 changed files with 67 additions and 27 deletions

View File

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

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

View File

@ -2,6 +2,7 @@
int main(int argc, char **argv)
{
factor::init_globals();
factor::start_standalone_factor(argc,argv);
return 0;
}

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

View File

@ -5,7 +5,7 @@
namespace factor
{
void c_to_factor_toplevel(cell quot)
void factorvm::c_to_factor_toplevel(cell quot)
{
for(;;)
{

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

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

View File

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

View File

@ -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();
}

View File

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