2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
19#ifndef ae2f_Sys_Thrd_auto_h
20#include <ae2f/Sys/Thrd.h>
21#define ae2f_Sys_Thrd_auto_h
26#include <ae2f/Macro.h>
35ae2f_MAC() __linux_ae2f_SysThrdMk_imp_call(
36 ae2f_eSysThrd_t ret_stat,
39 _ae2f_SysThrdRunnerPrm_t*
const prm_stck,
40 void*
const prm_stcktop,
47 , (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM)
52 (ret_stat) = ae2f_eSysThrdErr;
54 }
else if((ret_tid) == 0)
68
69
70
72 ae2f_eSysThrd_t ret_stat,
73 ae2f_SysThrd ret_thrd,
76 const size_t prm_stcksz
79 (ret_thrd).m_stck.m_void = mmap(
80 NULL, ((ret_thrd).m_stcksz = (
82 +
sizeof(_ae2f_SysThrdRunnerPrm_t)
86 , PROT_READ | PROT_WRITE
87 , MAP_PRIVATE | MAP_STACK | MAP_ANONYMOUS
91 if(MAP_FAILED == (ret_thrd).m_stck.m_void || !(ret_thrd).m_stck.m_void) {
93 (ret_thrd).m_stck.m_void = NULL;
96 (ret_thrd).m_stck.m_prm->m_arg = (prm_arg);
97 (ret_thrd).m_stck.m_prm->m_fn = (prm_func);
98 (ret_thrd).m_stck.m_prm->m_stcksz = (ret_thrd).m_stcksz;
100 ___linux_ae2f_SysThrdMk_imp_call(
101 ret_stat, (ret_thrd).m_id
103 , (ret_thrd).m_stck.m_prm
104 , __ae2f_SysThrdStckTopOper(((ret_thrd).m_stck.m_char), (prm_stcksz))
111 (ret_thrd).m_stck.m_void
112 , (ret_thrd).m_stcksz
114 (ret_thrd).m_stck.m_void = NULL;
121 ae2f_eSysThrd_t ret_stat,
123 const ae2f_SysThrd prm_thrd
128 unless((prm_thrd).m_stck.m_void) {
129 (ret_stat) = ae2f_eSysThrdErr;
133 if((prm_thrd).m_stck.m_prm->m_done)
140 , &(prm_thrd).m_stck.m_prm->m_done
144 (ret_rtn) = (prm_thrd).m_stck.m_prm->m_ret;
145 munmap((prm_thrd).m_stck.m_void, (prm_thrd).m_stcksz);
150 (ret_stat) = ae2f_eSysThrdErr;
159 syscall(SYS_sched_yield);
164 ,
const struct timespec *
const prm_req
165 ,
struct timespec *
const prm_rem
168 (ret_stat) = syscall(SYS_nanosleep, prm_req, prm_rem);
171#elif ae2f_Sys_WIN(!)0
172ae2f_MAC() ae2f_SysThrdMk_imp(
173 ae2f_eSysThrd_t ret_stat,
174 ae2f_SysThrd ret_thrd,
175 ae2f_SysThrdFn_t*
const prm_func,
177 const size_t prm_stcksz
186 , STACK_SIZE_PARAM_IS_A_RESERVATION
190 unless((ret_thrd).m_id) {
191 (ret_stat) = ae2f_eSysThrdErr;
193 (ret_stat) = ae2f_eSysThrdSuccess;
196ae2f_MAC() ae2f_SysThrdJoin_imp(
197 ae2f_eSysThrd_t ret_stat,
198 ae2f_SysThrdRes_t ret_rtn,
199 const ae2f_SysThrd prm_thrd
204 WaitForSingleObject((prm_thrd).m_id, INFINITE)
205 && GetExitCodeThread((prm_thrd).m_id, &(ret_rtn))
206 && CloseHandle((prm_thrd).m_id)
207 ) ? ae2f_eSysThrdSuccess : ae2f_eSysThrdErr;
212ae2f_MAC() ae2f_SysThrdYield_imp()
217ae2f_MAC() ae2f_SysThrdSleep_imp(
219 ,
const struct timespec *
const prm_req
220 ,
struct timespec *
const prm_rem
225 (prm_req)->tv_sec < 0 ||
226 (prm_req)->tv_nsec < 0 ||
227 (prm_req)->tv_nsec >= 1000000000
230 SetLastError(ERROR_INVALID_PARAMETER);
233 Sleep((DWORD)((prm_req)->tv_sec * 1000 + (prm_req)->tv_nsec / 1000000));
234 if ((prm_rem) != NULL) {
235 (prm_rem)->tv_sec = 0;
236 (prm_rem)->tv_nsec = 0;
247
248
249ae2f_MAC() ae2f_SysThrdMk_imp(
250 ae2f_eSysThrd_t ret_stat,
251 ae2f_SysThrd ret_thrd,
252 ae2f_SysThrdFn_t*
const prm_func,
254 const size_t prm_stcksz_unused
257 (ret_stat) = pthread_create(
259 , ae2f_reinterpret_cast(
const pthread_attr_t*, NULL)
266 (ret_stat) = ae2f_eSysThrdSuccess;
270 (ret_stat) = ae2f_eSysThrdMemOut;
276 (ret_stat) = ae2f_eSysThrdErr;
281ae2f_MAC() ae2f_SysThrdJoin_imp(
282 ae2f_eSysThrd_t ret_stat,
283 ae2f_SysThrdRes_t ret_rtn,
284 ae2f_SysThrd ref_thrd
287 switch(pthread_join((ref_thrd).m_id, &(ret_rtn)))
290 (ret_stat) = ae2f_eSysThrdBusy;
293 (ret_stat) = (ae2f_eSysThrdErr);
296 (ret_stat) = (ae2f_eSysThrdMemOut);
299 (ret_stat) = ae2f_eSysThrdSuccess;
305ae2f_MAC() ae2f_SysThrdSleep_imp(
307 ,
const struct timespec *
const prm_req
308 ,
struct timespec *
const prm_rem
311 (ret_stat) = nanosleep(prm_req, prm_rem);
314ae2f_MAC() ae2f_SysThrdYield_imp()
#define ae2f_reinterpret_cast(t, v)
#define unless(...)
Invokes when condition is false.
#define __ae2f_MACRO_GENERATED
#define _ae2f_SysFtxWait(ret_err, prm_uaddr, prm_val)
_ae2f_SysFtxRet_t ae2f_SysFtxRet_t
State for futex operation.
_ae2f_SysThrdRes_t ae2f_SysThrdRes_t
Return type for thread.
ae2f_SysThrdRes_t ae2f_SysThrdFn_t(ae2f_SysThrdPrm_t)
Thread starting function type.
_ae2f_SysThrdID_t ae2f_SysThrdID_t
Thread ID.