Removed un-needed function overload for setting userdata
Fixed bugs in win64 impl where it did not check if the process was a known invalid value
This commit is contained in:
@@ -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);
|
void uniproc_nullify_processes(uniproc_process* p, const size_t num_processes);
|
||||||
bool uniproc_is_process_null(const uniproc_process* p);
|
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_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_set_userdata(uniproc_process* p, void const* userdata);
|
||||||
void* uniproc_get_userdata(uniproc_process* p);
|
void* uniproc_get_userdata(uniproc_process* p);
|
||||||
@@ -142,9 +142,6 @@ void uniproc_await_any_processes(const uniproc_process* p, const size_t num_proc
|
|||||||
waitpid(0, nullptr, WIFEXITED | WIFSIGNALED | WCOREDUMP);
|
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)
|
void uniproc_set_userdata(uniproc_process * p, void const* userdata)
|
||||||
{ p->userdata = (uint64_t)userdata; }
|
{ p->userdata = (uint64_t)userdata; }
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
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));
|
HANDLE* h = (HANDLE*)malloc(num_processes*sizeof(HANDLE));
|
||||||
for (size_t i = 0; i < num_processes; ++i)
|
for (size_t i = 0; i < num_processes; ++i)
|
||||||
|
{
|
||||||
|
if (uniproc_is_process_null(p + i)) continue;
|
||||||
h[i] = (HANDLE)p[i]._proc_hdl;
|
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);
|
free(h);
|
||||||
|
|
||||||
if (return_codes == NULL) return;
|
if (return_codes == NULL) return;
|
||||||
for (size_t i = 0; i < num_processes; ++i)
|
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)
|
void uniproc_close_process(uniproc_process* p)
|
||||||
{
|
{
|
||||||
|
if (uniproc_is_process_null(p)) return;
|
||||||
TerminateProcess((HANDLE)p->_proc_hdl, 2);
|
TerminateProcess((HANDLE)p->_proc_hdl, 2);
|
||||||
CloseHandle((HANDLE)p->_proc_hdl);
|
CloseHandle((HANDLE)p->_proc_hdl);
|
||||||
fclose(p->in);
|
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)
|
bool uniproc_are_processes_finished(const uniproc_process* p, const size_t num_processes)
|
||||||
{
|
{
|
||||||
HANDLE* h = (HANDLE*)malloc(num_processes*sizeof(HANDLE));
|
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);
|
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)
|
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)
|
void uniproc_await_any_processes(const uniproc_process* p, const size_t num_processes)
|
||||||
{
|
{
|
||||||
HANDLE* h = (HANDLE*)malloc(num_processes * sizeof(HANDLE));
|
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);
|
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)
|
void uniproc_set_userdata(uniproc_process * p, void const* userdata)
|
||||||
{ p->userdata = (uint64_t)userdata; }
|
{ p->userdata = (uint64_t)userdata; }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user