Added basic win32 start-thread support

Phil Dawes 2009-08-23 14:36:24 +01:00
parent ce44511071
commit 915c765ecb
4 changed files with 35 additions and 0 deletions

View File

@ -277,4 +277,30 @@ VM_C_API void factor_sleep(long us)
return vm->factor_sleep(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);
}
} }

View File

@ -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 pass_args_to_factor(int argc, vm_char **argv);
VM_C_API void start_embedded_factor(vm_parameters *p); 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(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 char *factor_eval_string(char *string);
VM_C_API void factor_eval_free(char *result); VM_C_API void factor_eval_free(char *result);

View File

@ -3,6 +3,11 @@
namespace factor 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() s64 factorvm::current_micros()
{ {
FILETIME t; FILETIME t;

View File

@ -21,9 +21,12 @@ typedef char symbol_char;
FACTOR_STDCALL LONG exception_handler(PEXCEPTION_POINTERS pe); FACTOR_STDCALL LONG exception_handler(PEXCEPTION_POINTERS pe);
// SSE traps raise these exception codes, which are defined in internal NT headers // SSE traps raise these exception codes, which are defined in internal NT headers
// but not winbase.h // but not winbase.h
#define STATUS_FLOAT_MULTIPLE_FAULTS 0xC00002B4 #define STATUS_FLOAT_MULTIPLE_FAULTS 0xC00002B4
#define STATUS_FLOAT_MULTIPLE_TRAPS 0xC00002B5 #define STATUS_FLOAT_MULTIPLE_TRAPS 0xC00002B5
void start_thread(void *(*start_routine)(void *),void *args);
} }