Beispiel #1
0
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));
}
Beispiel #2
0
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)));
}
Beispiel #3
0
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);
}
Beispiel #4
0
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);
}
Beispiel #5
0
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;
}
Beispiel #6
0
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;
}
Beispiel #7
0
CAMLprim value ml_nonportable_to_caml_signal_number(value v_signo)
{
  return Val_int(caml_rev_convert_signal_number(Int_val(v_signo)));
}