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