Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
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);
}
Ejemplo n.º 5
0
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);
}
Ejemplo n.º 6
0
Archivo: mvm.hpp Proyecto: erg/factor
inline factor_vm *current_vm()
{
	factor_vm *vm = current_vm_p();
	assert(vm != NULL);
	return vm;
}