From: Phil Dawes Date: Sun, 23 Aug 2009 13:36:24 +0000 (+0100) Subject: Added basic win32 start-thread support X-Git-Tag: 0.97~5502^2~2^2~54 X-Git-Url: https://gitweb.factorcode.org/gitweb.cgi?p=factor.git;a=commitdiff_plain;h=0a15e20e1282565dc760200c3b92deb4a02f6c85 Added basic win32 start-thread support --- diff --git a/vm/factor.cpp b/vm/factor.cpp index 55d7abcc49..883b4f9462 100755 --- a/vm/factor.cpp +++ b/vm/factor.cpp @@ -277,4 +277,30 @@ VM_C_API void factor_sleep(long us) return vm->factor_sleep(us); } +struct startargs { + int argc; + vm_char **argv; +}; + +void* start_standalone_factor_thread(void *arg) +{ + factorvm *newvm = new factorvm; + startargs *args = (startargs*) arg; + vm_parameters p; + newvm->default_parameters(&p); + newvm->init_parameters_from_args(&p,args->argc, args->argv); + newvm->init_factor(&p); + newvm->pass_args_to_factor(args->argc,args->argv); + newvm->start_factor(&p); + return 0; +} + + +VM_C_API void start_standalone_factor_in_new_thread(int argc, vm_char **argv) +{ + startargs *args = new startargs; // leaks startargs structure + args->argc = argc; args->argv = argv; + start_thread(start_standalone_factor_thread,args); +} + } diff --git a/vm/factor.hpp b/vm/factor.hpp index 6e00bc012e..b2aeccd1a6 100644 --- a/vm/factor.hpp +++ b/vm/factor.hpp @@ -7,6 +7,7 @@ VM_C_API void init_factor(vm_parameters *p); VM_C_API void pass_args_to_factor(int argc, vm_char **argv); VM_C_API void start_embedded_factor(vm_parameters *p); VM_C_API void start_standalone_factor(int argc, vm_char **argv); +VM_C_API void start_standalone_factor_in_new_thread(int argc, vm_char **argv); VM_C_API char *factor_eval_string(char *string); VM_C_API void factor_eval_free(char *result); diff --git a/vm/os-windows-nt.cpp b/vm/os-windows-nt.cpp index 535e7b8640..9187b88986 100755 --- a/vm/os-windows-nt.cpp +++ b/vm/os-windows-nt.cpp @@ -3,6 +3,11 @@ namespace factor { +void start_thread(void *(*start_routine)(void *),void *args){ + CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start_routine, args, 0, 0); +} + + s64 factorvm::current_micros() { FILETIME t; diff --git a/vm/os-windows-nt.hpp b/vm/os-windows-nt.hpp index c083844ae0..27923a000a 100755 --- a/vm/os-windows-nt.hpp +++ b/vm/os-windows-nt.hpp @@ -21,9 +21,12 @@ typedef char symbol_char; FACTOR_STDCALL LONG exception_handler(PEXCEPTION_POINTERS pe); + // SSE traps raise these exception codes, which are defined in internal NT headers // but not winbase.h #define STATUS_FLOAT_MULTIPLE_FAULTS 0xC00002B4 #define STATUS_FLOAT_MULTIPLE_TRAPS 0xC00002B5 +void start_thread(void *(*start_routine)(void *),void *args); + }