void caml_execute_signal(int signal_number, int in_signal_handler) { value res; #ifdef POSIX_SIGNALS sigset_t sigs; /* Block the signal before executing the handler, and record in sigs the original signal mask */ sigemptyset(&sigs); sigaddset(&sigs, signal_number); sigprocmask(SIG_BLOCK, &sigs, &sigs); #endif res = caml_callback_exn( Field(caml_signal_handlers, signal_number), Val_int(caml_rev_convert_signal_number(signal_number))); #ifdef POSIX_SIGNALS if (! in_signal_handler) { /* Restore the original signal mask */ sigprocmask(SIG_SETMASK, &sigs, NULL); } else if (Is_exception_result(res)) { /* Restore the original signal mask and unblock the signal itself */ sigdelset(&sigs, signal_number); sigprocmask(SIG_SETMASK, &sigs, NULL); } #endif if (Is_exception_result(res)) caml_raise(Extract_exception(res)); }
CAMLprim value caml_extunix_ssi_signo_sys(value vssi) { CAMLparam1(vssi); struct signalfd_siginfo *ssi = (void *)(Data_custom_val(vssi)); CAMLreturn(Val_int(caml_rev_convert_signal_number(ssi->ssi_signo))); }
static value alloc_process_status(int pid, int status) { value st; if (WIFEXITED(status)) { st = caml_alloc_1(TAG_WEXITED, Val_int(WEXITSTATUS(status))); } else if (WIFSTOPPED(status)) { st = caml_alloc_1(TAG_WSTOPPED, Val_int(caml_rev_convert_signal_number(WSTOPSIG(status)))); } else { st = caml_alloc_1(TAG_WSIGNALED, Val_int(caml_rev_convert_signal_number(WTERMSIG(status)))); } return caml_alloc_2(0, Val_int(pid), st); }
static value alloc_process_status(int pid, int status, value ru) { CAMLparam1(ru); CAMLlocal2(st,res); if (WIFEXITED(status)) { st = alloc_small(1, TAG_WEXITED); Field(st, 0) = Val_int(WEXITSTATUS(status)); } else if (WIFSTOPPED(status)) { st = alloc_small(1, TAG_WSTOPPED); Field(st, 0) = Val_int(caml_rev_convert_signal_number(WSTOPSIG(status))); } else { st = alloc_small(1, TAG_WSIGNALED); Field(st, 0) = Val_int(caml_rev_convert_signal_number(WTERMSIG(status))); } res = alloc_small(3, 0); Field(res, 0) = Val_int(pid); Field(res, 1) = st; Field(res, 2) = ru; CAMLreturn(res); }
static value alloc_process_status(int pid, int status) { value st, res; if (WIFEXITED(status)) { st = alloc_small(1, TAG_WEXITED); Field(st, 0) = Val_int(WEXITSTATUS(status)); } else if (WIFSTOPPED(status)) { st = alloc_small(1, TAG_WSTOPPED); Field(st, 0) = Val_int(caml_rev_convert_signal_number(WSTOPSIG(status))); } else { st = alloc_small(1, TAG_WSIGNALED); Field(st, 0) = Val_int(caml_rev_convert_signal_number(WTERMSIG(status))); } Begin_root (st); res = alloc_small(2, 0); Field(res, 0) = Val_int(pid); Field(res, 1) = st; End_roots(); return res; }
static value encode_sigset(sigset_t * set) { value res = Val_int(0); int i; Begin_root(res) for (i = 1; i < NSIG; i++) if (sigismember(set, i) > 0) { value newcons = alloc_small(2, 0); Init_field(newcons, 0, Val_int(caml_rev_convert_signal_number(i))); Init_field(newcons, 1, res); res = newcons; } End_roots(); return res; }
CAMLprim value ml_nonportable_to_caml_signal_number(value v_signo) { return Val_int(caml_rev_convert_signal_number(Int_val(v_signo))); }