[ ]
tri copy-register ;
+
+
M:: x86.64 %box ( n rep func -- )
n [
n
] [
rep load-return-value
] if
- func %vm-invoke-2nd-arg ;
+ rep int-rep? [ func %vm-invoke-2nd-arg ] [ func %vm-invoke-1st-arg ] if ;
M: x86.64 %box-long-long ( n func -- )
[ int-rep ] dip %box ;
--- /dev/null
+USING: alien.syntax io io.encodings.utf16n io.encodings.utf8 io.files
+kernel namespaces sequences system threads unix.utilities ;
+IN: mttest
+
+FUNCTION: void* start_standalone_factor_in_new_thread ( int argc, char** argv ) ;
+
+HOOK: native-string-encoding os ( -- encoding )
+M: windows native-string-encoding utf16n ;
+M: unix native-string-encoding utf8 ;
+
+: start-vm-in-os-thread ( args -- threadhandle )
+ \ vm get-global prefix
+ [ length ] [ native-string-encoding strings>alien ] bi
+ start_standalone_factor_in_new_thread ;
+
+: start-tetris-in-os-thread ( -- )
+ { "-run=tetris" } start-vm-in-os-thread drop ;
+
+: start-testthread-in-os-thread ( -- )
+ { "-run=mttest" } start-vm-in-os-thread drop ;
+
+: testthread ( -- )
+ "/tmp/hello" utf8 [ "hello!\n" write ] with-file-appender 5000000 sleep ;
+
+MAIN: testthread
\ No newline at end of file
void memory_signal_handler_impl()
{
- SIGNAL_VM_PTR->misc_signal_handler_impl();
+ SIGNAL_VM_PTR()->misc_signal_handler_impl();
}
void factorvm::misc_signal_handler_impl()
void misc_signal_handler_impl()
{
- SIGNAL_VM_PTR->misc_signal_handler_impl();
+ SIGNAL_VM_PTR()->misc_signal_handler_impl();
}
void factorvm::fp_signal_handler_impl()
dpush(allot_float(flo));
}
-VM_C_API void box_double(double flo,factorvm *myvm) // not sure if this is ever called
+VM_C_API void box_double(double flo,factorvm *myvm)
{
ASSERTVM();
return VM_PTR->box_double(flo);
void memory_signal_handler(int signal, siginfo_t *siginfo, void *uap)
{
- factorvm *myvm = lookup_vm(thread_id());
+ factorvm *myvm = SIGNAL_VM_PTR();
myvm->signal_fault_addr = (cell)siginfo->si_addr;
myvm->signal_callstack_top = myvm->uap_stack_pointer(uap);
UAP_PROGRAM_COUNTER(uap) = (cell)memory_signal_handler_impl;
void misc_signal_handler(int signal, siginfo_t *siginfo, void *uap)
{
- factorvm *myvm = lookup_vm(thread_id());
+ factorvm *myvm = SIGNAL_VM_PTR();
myvm->signal_number = signal;
myvm->signal_callstack_top = myvm->uap_stack_pointer(uap);
UAP_PROGRAM_COUNTER(uap) = (cell)misc_signal_handler_impl;
explicit tagged(cell tagged) : value_(tagged) {
#ifdef FACTOR_DEBUG
- untag_check(SIGNAL_VM_PTR);
+ untag_check(SIGNAL_VM_PTR());
#endif
}
explicit tagged(TYPE *untagged) : value_(factor::tag(untagged)) {
#ifdef FACTOR_DEBUG
- untag_check(SIGNAL_VM_PTR);
+ untag_check(SIGNAL_VM_PTR());
#endif
}
#define PRIMITIVE_OVERFLOW_GETVM() vm
#define VM_PTR vm
#define ASSERTVM()
- #define SIGNAL_VM_PTR vm
+ #define SIGNAL_VM_PTR() vm
#endif
#ifdef FACTOR_TESTING_MULTITHREADED
#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() lookup_vm(thread_id())
#endif
#ifdef FACTOR_MULTITHREADED
#define PRIMITIVE_OVERFLOW_GETVM() ((factorvm*)myvm)
#define VM_PTR myvm
#define ASSERTVM()
- #define SIGNAL_VM_PTR lookup_vm(thread_id())
+ #define SIGNAL_VM_PTR() lookup_vm(thread_id())
#endif
}