diff --git a/include/uniproc.h b/include/uniproc.h index c08a656..189e4a7 100644 --- a/include/uniproc.h +++ b/include/uniproc.h @@ -22,6 +22,5 @@ bool uniproc_are_processes_finished(const uniproc_process* p, const size_t num_p void uniproc_nullify_processes(uniproc_process* p, const size_t num_processes); bool uniproc_is_process_null(const uniproc_process* p); void uniproc_await_any_processes(const uniproc_process* p, const size_t num_processes); -void uniproc_set_userdata(uniproc_process* p, const uint64_t userdata); void uniproc_set_userdata(uniproc_process* p, void const* userdata); void* uniproc_get_userdata(uniproc_process* p); \ No newline at end of file diff --git a/src/uniproc_unix.c b/src/uniproc_unix.c index 68471b7..b6cf81e 100644 --- a/src/uniproc_unix.c +++ b/src/uniproc_unix.c @@ -142,9 +142,6 @@ void uniproc_await_any_processes(const uniproc_process* p, const size_t num_proc waitpid(0, nullptr, WIFEXITED | WIFSIGNALED | WCOREDUMP); } -void uniproc_set_userdata(uniproc_process* p, const uint64_t userdata) -{ p->userdata = userdata; } - void uniproc_set_userdata(uniproc_process * p, void const* userdata) { p->userdata = (uint64_t)userdata; } diff --git a/src/uniproc_win64.c b/src/uniproc_win64.c index e742145..7ea7292 100644 --- a/src/uniproc_win64.c +++ b/src/uniproc_win64.c @@ -150,20 +150,29 @@ uniproc_process uniproc_create_process(const char* cmd, const size_t num_args, c void uniproc_await_processes(uniproc_process* p, int* return_codes, size_t num_processes) { + size_t num_valid_handles = 0; HANDLE* h = (HANDLE*)malloc(num_processes*sizeof(HANDLE)); for (size_t i = 0; i < num_processes; ++i) + { + if (uniproc_is_process_null(p + i)) continue; h[i] = (HANDLE)p[i]._proc_hdl; + num_valid_handles++; + } - WaitForMultipleObjects(num_processes, h, 1, INFINITE); + WaitForMultipleObjects(num_valid_handles, h, 1, INFINITE); free(h); if (return_codes == NULL) return; for (size_t i = 0; i < num_processes; ++i) - GetExitCodeProcess((HANDLE)p[i]._proc_hdl, (LPDWORD)(return_codes+i)); + { + if (uniproc_is_process_null(p + i)) continue; + GetExitCodeProcess((HANDLE)p[i]._proc_hdl, (LPDWORD)(return_codes + i)); + } } void uniproc_close_process(uniproc_process* p) { + if (uniproc_is_process_null(p)) return; TerminateProcess((HANDLE)p->_proc_hdl, 2); CloseHandle((HANDLE)p->_proc_hdl); fclose(p->in); @@ -175,9 +184,16 @@ void uniproc_close_process(uniproc_process* p) bool uniproc_are_processes_finished(const uniproc_process* p, const size_t num_processes) { HANDLE* h = (HANDLE*)malloc(num_processes*sizeof(HANDLE)); - DWORD ret = WaitForMultipleObjects(num_processes, h, true, 0); + size_t num_valid_handles = 0; + for (size_t i = 0; i < num_processes; ++i) + { + if (uniproc_is_process_null(p + i)) continue; + h[i] = (HANDLE)p[i]._proc_hdl; + num_valid_handles++; + } + DWORD ret = WaitForMultipleObjects(num_valid_handles, h, true, 0); free(h); - return ret >= WAIT_OBJECT_0 && ret < WAIT_OBJECT_0 + num_processes; + return ret >= WAIT_OBJECT_0 && ret < WAIT_OBJECT_0 + num_valid_handles; } void uniproc_nullify_processes(uniproc_process* p, const size_t num_processes) @@ -189,13 +205,17 @@ void uniproc_is_process_null(const uniproc_process* p) void uniproc_await_any_processes(const uniproc_process* p, const size_t num_processes) { HANDLE* h = (HANDLE*)malloc(num_processes * sizeof(HANDLE)); - WaitForMultipleObjects(num_processes, h, false, INFINITE); + size_t num_valid_handles = 0; + for (size_t i = 0; i < num_processes; ++i) + { + if (uniproc_is_process_null(p + i)) continue; + h[i] = (HANDLE)p[i]._proc_hdl; + num_valid_handles++; + } + WaitForMultipleObjects(num_valid_handles, h, false, INFINITE); free(h); } -void uniproc_set_userdata(uniproc_process* p, const uint64_t userdata) -{ p->userdata = userdata; } - void uniproc_set_userdata(uniproc_process * p, void const* userdata) { p->userdata = (uint64_t)userdata; }