VM_C_API LONG exception_handler(PEXCEPTION_RECORD e, void* frame, PCONTEXT c, void* dispatch) { factor_vm* vm = current_vm_p(); if (factor_vm::fatal_erroring_p || !vm) return ExceptionContinueSearch; return vm->exception_handler(e, frame, c, dispatch); }
void enqueue_signal_handler(int signal, siginfo_t* siginfo, void* uap) { if (factor_vm::fatal_erroring_p) return; factor_vm* vm = current_vm_p(); if (vm) enqueue_signal(vm, signal); }
void fep_signal_handler(int signal, siginfo_t* siginfo, void* uap) { if (factor_vm::fatal_erroring_p) return; factor_vm* vm = current_vm_p(); if (vm) { vm->safepoint.enqueue_fep(vm); enqueue_signal(vm, signal); } else fatal_error("Foreign thread received signal", signal); }
void synchronous_signal_handler(int signal, siginfo_t* siginfo, void* uap) { if (factor_vm::fatal_erroring_p) return; factor_vm* vm = current_vm_p(); if (vm) { vm->signal_number = signal; vm->dispatch_signal(uap, factor::synchronous_signal_handler_impl); } else fatal_error("Foreign thread received signal", signal); }
void sample_signal_handler(int signal, siginfo_t* siginfo, void* uap) { factor_vm* vm = current_vm_p(); bool foreign_thread = false; if (vm == NULL) { foreign_thread = true; vm = thread_vms.begin()->second; } if (atomic::load(&vm->sampling_profiler_p)) vm->safepoint.enqueue_samples(vm, 1, (cell)UAP_PROGRAM_COUNTER(uap), foreign_thread); else if (!foreign_thread) enqueue_signal(vm, signal); }
inline factor_vm *current_vm() { factor_vm *vm = current_vm_p(); assert(vm != NULL); return vm; }