Compare commits

..

9 Commits

2 changed files with 30 additions and 22 deletions

View File

@@ -1,26 +1,33 @@
#pragma once
#ifdef __cplusplus
extern "C"
{
#endif
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <Windows.h>
typedef struct {
typedef struct {
uint64_t userdata;
FILE* in;
FILE* out;
FILE* err;
uint64_t userdata;
FILE* in;
FILE* out;
FILE* err;
// OS-dependent handle to the process
uint32_t _proc_hdl;
// OS-dependent handle to the process
uint32_t _proc_hdl;
} uniproc_process;
} uniproc_process;
uniproc_process uniproc_create_process(const char* cmd, const size_t num_args, const char** argv);
void uniproc_await_processes(const uniproc_process* p, int* return_codes, const size_t num_processes);
void uniproc_close_process(uniproc_process* p);
int uniproc_are_processes_finished(const uniproc_process* p, const size_t num_processes);
void uniproc_nullify_processes(uniproc_process* p, const size_t num_processes);
int 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, void const* userdata);
void* uniproc_get_userdata(uniproc_process* p);
uniproc_process uniproc_create_process(const char* cmd, const size_t num_args, const char** argv);
void uniproc_await_processes(const uniproc_process* p, int* return_codes, const size_t num_processes);
void uniproc_close_process(uniproc_process* p);
int uniproc_are_processes_finished(const uniproc_process* p, const size_t num_processes);
void uniproc_nullify_processes(uniproc_process* p, const size_t num_processes);
int 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, void const* userdata);
void* uniproc_get_userdata(uniproc_process* p);
#ifdef __cplusplus
}
#endif

View File

@@ -155,10 +155,9 @@ void uniproc_await_processes(const uniproc_process* p, int* return_codes, const
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++;
h[num_valid_handles++] = (HANDLE)p[i]._proc_hdl;
}
if (num_valid_handles == 0) return;
WaitForMultipleObjects(num_valid_handles, h, 1, INFINITE);
free(h);
@@ -191,6 +190,7 @@ int uniproc_are_processes_finished(const uniproc_process* p, const size_t num_pr
h[i] = (HANDLE)p[i]._proc_hdl;
num_valid_handles++;
}
if (num_valid_handles == 0) return 1;
DWORD ret = WaitForMultipleObjects(num_valid_handles, h, 1, 0);
free(h);
return ret >= WAIT_OBJECT_0 && ret < WAIT_OBJECT_0 + num_valid_handles;
@@ -212,7 +212,8 @@ void uniproc_await_any_processes(const uniproc_process* p, const size_t num_proc
h[i] = (HANDLE)p[i]._proc_hdl;
num_valid_handles++;
}
WaitForMultipleObjects(num_valid_handles, h, false, INFINITE);
if (num_valid_handles == 0) return;
WaitForMultipleObjects(num_valid_handles, h, 0, INFINITE);
free(h);
}