Compare commits
9 Commits
f423cd3db2
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
fe9ed46859
|
|||
|
8948e75d06
|
|||
|
c23fd535b0
|
|||
|
f93fe3deae
|
|||
|
e4369a403f
|
|||
|
e92fbe04cb
|
|||
|
0259a5bb25
|
|||
|
6060ea8960
|
|||
|
5c5abfd36c
|
@@ -1,26 +1,33 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
||||||
uint64_t userdata;
|
uint64_t userdata;
|
||||||
FILE* in;
|
FILE* in;
|
||||||
FILE* out;
|
FILE* out;
|
||||||
FILE* err;
|
FILE* err;
|
||||||
|
|
||||||
// OS-dependent handle to the process
|
// OS-dependent handle to the process
|
||||||
uint32_t _proc_hdl;
|
uint32_t _proc_hdl;
|
||||||
|
|
||||||
} uniproc_process;
|
} uniproc_process;
|
||||||
|
|
||||||
uniproc_process uniproc_create_process(const char* cmd, const size_t num_args, const char** argv);
|
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_await_processes(const uniproc_process* p, int* return_codes, const size_t num_processes);
|
||||||
void uniproc_close_process(uniproc_process* p);
|
void uniproc_close_process(uniproc_process* p);
|
||||||
int uniproc_are_processes_finished(const uniproc_process* p, const size_t num_processes);
|
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);
|
void uniproc_nullify_processes(uniproc_process* p, const size_t num_processes);
|
||||||
int uniproc_is_process_null(const uniproc_process* p);
|
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_await_any_processes(const uniproc_process* p, const size_t num_processes);
|
||||||
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);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@@ -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)
|
for (size_t i = 0; i < num_processes; ++i)
|
||||||
{
|
{
|
||||||
if (uniproc_is_process_null(p + i)) continue;
|
if (uniproc_is_process_null(p + i)) continue;
|
||||||
h[i] = (HANDLE)p[i]._proc_hdl;
|
h[num_valid_handles++] = (HANDLE)p[i]._proc_hdl;
|
||||||
num_valid_handles++;
|
|
||||||
}
|
}
|
||||||
|
if (num_valid_handles == 0) return;
|
||||||
WaitForMultipleObjects(num_valid_handles, h, 1, INFINITE);
|
WaitForMultipleObjects(num_valid_handles, h, 1, INFINITE);
|
||||||
free(h);
|
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;
|
h[i] = (HANDLE)p[i]._proc_hdl;
|
||||||
num_valid_handles++;
|
num_valid_handles++;
|
||||||
}
|
}
|
||||||
|
if (num_valid_handles == 0) return 1;
|
||||||
DWORD ret = WaitForMultipleObjects(num_valid_handles, h, 1, 0);
|
DWORD ret = WaitForMultipleObjects(num_valid_handles, h, 1, 0);
|
||||||
free(h);
|
free(h);
|
||||||
return ret >= WAIT_OBJECT_0 && ret < WAIT_OBJECT_0 + num_valid_handles;
|
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;
|
h[i] = (HANDLE)p[i]._proc_hdl;
|
||||||
num_valid_handles++;
|
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);
|
free(h);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user