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:
2025-03-06 15:54:50 +11:00
parent 12cc5bd38e
commit 500fe17076
3 changed files with 28 additions and 12 deletions

View File

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

View File

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

View File

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