Added basic win32 start-thread support
parent
ce44511071
commit
915c765ecb
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue