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); } }
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); } }
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); }
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); }
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); }
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)); }