示例#1
0
CAMLprim value onlyWin32_waitpids_ml(value ncount_v, value pid_reqs_v)
{
  int flags,i;
  DWORD status, retcode;
  DWORD err = 0;
  int ncount = Int_val(ncount_v);
  HANDLE* pid_reqs;
  HANDLE pid_req;

  pid_reqs = malloc(sizeof(HANDLE) * ncount);
  for(i=0; i < ncount; i++){
     pid_reqs[i] = (HANDLE) Long_val(Field(pid_reqs_v,i));
  }
  enter_blocking_section();
  retcode = WaitForMultipleObjects(ncount, pid_reqs, FALSE,INFINITE);
  if (retcode == WAIT_FAILED) err = GetLastError();
  leave_blocking_section();
  if (err) {
    free(pid_reqs);
    win32_maperr(err);
    uerror("waitpids", Nothing);
  }
  pid_req = pid_reqs[retcode - WAIT_OBJECT_0];
  free(pid_reqs);
  if (! GetExitCodeProcess(pid_req, &status)) {
    win32_maperr(GetLastError());
    uerror("waitpids", Nothing);
  }
  if (status == STILL_ACTIVE)
    return alloc_process_status((HANDLE) 0, 0);
  else {
    CloseHandle(pid_req);
    return alloc_process_status(pid_req, status);
  }
}
示例#2
0
CAMLprim value win_waitpid(value vflags, value vpid_req)
{
  int flags;
  DWORD status, retcode;
  HANDLE pid_req = (HANDLE) Long_val(vpid_req);
  DWORD err = 0;

  flags = convert_flag_list(vflags, wait_flag_table);
  if ((flags & CAML_WNOHANG) == 0) {
    enter_blocking_section();
    retcode = WaitForSingleObject(pid_req, INFINITE);
    if (retcode == WAIT_FAILED) err = GetLastError();
    leave_blocking_section();
    if (err) {
      win32_maperr(err);
      uerror("waitpid", Nothing);
    }
  }
  if (! GetExitCodeProcess(pid_req, &status)) {
    win32_maperr(GetLastError());
    uerror("waitpid", Nothing);
  }
  if (status == STILL_ACTIVE)
    return alloc_process_status((HANDLE) 0, 0);
  else {
    CloseHandle(pid_req);
    return alloc_process_status(pid_req, status);
  }
}
示例#3
0
文件: wait.c 项目: stedolan/ocaml
CAMLprim value unix_wait(value unit)
{
  int pid, status;

  enter_blocking_section();
  pid = wait(&status);
  leave_blocking_section();
  if (pid == -1) uerror("wait", Nothing);
  return alloc_process_status(pid, status);
}
示例#4
0
文件: wait.c 项目: tararc/talc
struct result *unix_waitpid(array flags, int pid_req)
{
    int pid, status;

    pid = waitpid(pid_req, &status,
                  convert_flags(flags, wait_flag_table));
    if (pid == -1)
        unix_error(__FILE__,__LINE__,"waitpid");
    return alloc_process_status(pid, status);
}
示例#5
0
文件: wait.c 项目: stedolan/ocaml
CAMLprim value unix_waitpid(value flags, value pid_req)
{
  int pid, status, cv_flags;

  cv_flags = convert_flag_list(flags, wait_flag_table);
  enter_blocking_section();
  pid = waitpid(Int_val(pid_req), &status, cv_flags);
  leave_blocking_section();
  if (pid == -1) uerror("waitpid", Nothing);
  return alloc_process_status(pid, status);
}
示例#6
0
文件: oci_stubs.c 项目: bobot/oci
CAMLprim value oci_wait4(value flags, value pid_req)
{
  CAMLparam0();
  CAMLlocal1(v_usage);
  int pid, status, cv_flags;
  struct rusage ru;

  cv_flags = convert_flag_list(flags, wait_flag_table);
  enter_blocking_section();
  pid = wait4(Int_val(pid_req), &status, cv_flags, &ru);
  leave_blocking_section();
  if (pid == -1) uerror("wait4", pid_req);

  v_usage = caml_alloc(16, 0);
  Store_field(v_usage, 0,
              caml_copy_double((double) ru.ru_utime.tv_sec +
                               (double) ru.ru_utime.tv_usec / 1e6));
  Store_field(v_usage, 1,
              caml_copy_double((double) ru.ru_stime.tv_sec +
                               (double) ru.ru_stime.tv_usec / 1e6));
  Store_field(v_usage, 2, caml_copy_int64(ru.ru_maxrss));
  Store_field(v_usage, 3, caml_copy_int64(ru.ru_ixrss));
  Store_field(v_usage, 4, caml_copy_int64(ru.ru_idrss));
  Store_field(v_usage, 5, caml_copy_int64(ru.ru_isrss));
  Store_field(v_usage, 6, caml_copy_int64(ru.ru_minflt));
  Store_field(v_usage, 7, caml_copy_int64(ru.ru_majflt));
  Store_field(v_usage, 8, caml_copy_int64(ru.ru_nswap));
  Store_field(v_usage, 9, caml_copy_int64(ru.ru_inblock));
  Store_field(v_usage, 10, caml_copy_int64(ru.ru_oublock));
  Store_field(v_usage, 11, caml_copy_int64(ru.ru_msgsnd));
  Store_field(v_usage, 12, caml_copy_int64(ru.ru_msgrcv));
  Store_field(v_usage, 13, caml_copy_int64(ru.ru_nsignals));
  Store_field(v_usage, 14, caml_copy_int64(ru.ru_nvcsw));
  Store_field(v_usage, 15, caml_copy_int64(ru.ru_nivcsw));

  CAMLreturn(alloc_process_status(pid, status,v_usage));
}