1#undef __ae2f_MACRO_GENERATED
2#define __ae2f_MACRO_GENERATED 1
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
21#ifndef ae2f_Sys_Thrd_auto_h
22#include <ae2f/Sys/Thrd.h>
23#undef __ae2f_MACRO_GENERATED
24#define __ae2f_MACRO_GENERATED 1
25#define ae2f_Sys_Thrd_auto_h
30#include <ae2f/Macro.h>
31#undef __ae2f_MACRO_GENERATED
32#define __ae2f_MACRO_GENERATED 1
40#undef __ae2f_MACRO_GENERATED
41#define __ae2f_MACRO_GENERATED 1
43#define ___linux_ae2f_SysThrdMk_imp_call(
54)\
55{
59 , (CLONE_VM
| CLONE_FS
| CLONE_FILES
| CLONE_SIGHAND
| CLONE_THREAD
| CLONE_SYSVSEM
)
64 (ret_stat) = ae2f_eSysThrdErr;
66 } else if((ret_tid) == 0
)
72 (ret_stat) = ae2f_eSysThrdSuccess;
75}
80
81
82
83#define _ae2f_SysThrdMk_imp(
93)\
94{
95 (ret_thrd).m_stck.m_void = mmap(
96 NULL
, ((ret_thrd).m_stcksz = (
98 + sizeof(_ae2f_SysThrdRunnerPrm_t)
102 , PROT_READ
| PROT_WRITE
103 , MAP_PRIVATE
| MAP_STACK
| MAP_ANONYMOUS
107 if(MAP_FAILED
== (ret_thrd).m_stck.m_void || !(ret_thrd).m_stck.m_void) {
108 (ret_stat) = ae2f_eSysThrdMemOut;
109 (ret_thrd).m_stck.m_void = NULL
;
112 (ret_thrd).m_stck.m_prm->m_arg = (prm_arg);
113 (ret_thrd).m_stck.m_prm->m_fn = (prm_func);
114 (ret_thrd).m_stck.m_prm->m_stcksz = (ret_thrd).m_stcksz;
116 ___linux_ae2f_SysThrdMk_imp_call
(
117 ret_stat, (ret_thrd).m_id
119 , (ret_thrd).m_stck.m_prm
120 , __ae2f_SysThrdStckTopOper
(((ret_thrd).m_stck.m_char), (prm_stcksz))
124 if(ret_stat != ae2f_eSysThrdSuccess)
127 (ret_thrd).m_stck.m_void
128 , (ret_thrd).m_stcksz
130 (ret_thrd).m_stck.m_void = NULL
;
133}
136#define _ae2f_SysThrdJoin_imp(
144)\
145{
146 ae2f_SysFtxRet_t v_res;
148 unless((prm_thrd).m_stck.m_void) {
149 (ret_stat) = ae2f_eSysThrdErr;
153 if((prm_thrd).m_stck.m_prm->m_done)
160 , &(prm_thrd).m_stck.m_prm->m_done
164 (ret_rtn) = (prm_thrd).m_stck.m_prm->m_ret;
165 munmap((prm_thrd).m_stck.m_void, (prm_thrd).m_stcksz);
170 (ret_stat) = ae2f_eSysThrdErr;
172 (ret_stat) = ae2f_eSysThrdSuccess;
175}
177#define _ae2f_SysThrdYield_imp(
183)\
184{
185 syscall(SYS_sched_yield
); \
186}
188#define _ae2f_SysThrdSleep_imp(
196)\
197{
198 (ret_stat) = syscall(SYS_nanosleep
, prm_req, prm_rem); \
199}
201#elif ae2f_Sys_WIN(!)0
202#define _ae2f_SysThrdMk_imp(
212)\
213{
220 , STACK_SIZE_PARAM_IS_A_RESERVATION
224 unless((ret_thrd).m_id) {
225 (ret_stat) = ae2f_eSysThrdErr;
227 (ret_stat) = ae2f_eSysThrdSuccess; \
228}
230#define _ae2f_SysThrdJoin_imp(
238)\
239{
242 WaitForSingleObject((prm_thrd).m_id, INFINITE)
243 && GetExitCodeThread((prm_thrd).m_id, &(ret_rtn))
244 && CloseHandle((prm_thrd).m_id)
245 ) ? ae2f_eSysThrdSuccess : ae2f_eSysThrdErr; \
246}
250#define _ae2f_SysThrdYield_imp(
256)\
257{
259}
261#define _ae2f_SysThrdSleep_imp(
269)\
270{
273 (prm_req)->tv_sec < 0
||
274 (prm_req)->tv_nsec < 0
||
275 (prm_req)->tv_nsec >= 1000000000
278 SetLastError(ERROR_INVALID_PARAMETER);
281 Sleep((DWORD)((prm_req)->tv_sec * 1000
+ (prm_req)->tv_nsec / 1000000
));
282 if ((prm_rem) != NULL) {
283 (prm_rem)->tv_sec = 0
;
284 (prm_rem)->tv_nsec = 0
;
288}
295
296
297#define _ae2f_SysThrdMk_imp(
307)\
308{
309 (ret_stat) = pthread_create(
311 , ae2f_reinterpret_cast(const pthread_attr_t*, NULL)
318 (ret_stat) = ae2f_eSysThrdSuccess;
322 (ret_stat) = ae2f_eSysThrdMemOut;
328 (ret_stat) = ae2f_eSysThrdErr;
331}
333#define _ae2f_SysThrdJoin_imp(
341)\
342{
343 switch(pthread_join((ref_thrd).m_id, &(ret_rtn)))
346 (ret_stat) = ae2f_eSysThrdBusy;
349 (ret_stat) = (ae2f_eSysThrdErr);
352 (ret_stat) = (ae2f_eSysThrdMemOut);
355 (ret_stat) = ae2f_eSysThrdSuccess;
358}
361#define _ae2f_SysThrdSleep_imp(
369)\
370{
371 (ret_stat) = nanosleep(prm_req, prm_rem); \
372}
374#define _ae2f_SysThrdYield_imp(
380)\
381{
383}
388#undef __ae2f_MACRO_GENERATED
390#define __ae2f_MACRO_GENERATED 0
#define ae2f_structdef(key, name)
#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)
#define _ae2f_SysFtxWakeOne(ret_err, prm_uaddr)
_ae2f_SysFtxRet_t ae2f_SysFtxRet_t
State for futex operation.
_ae2f_SysFtxEl_t ae2f_SysFtxEl_t
Futex address element type.
#define _ae2f_SysThrdJoin_imp(ret_stat, ret_rtn, ref_thrd)
#define _ae2f_SysThrdYield_imp()
#define _ae2f_SysThrdSleep_imp(ret_stat, prm_req, prm_rem)
#define ae2f_Sys_Thrd_auto_h
#define _ae2f_SysThrdMk_imp(ret_stat, ret_thrd, prm_func, prm_arg, prm_stcksz_unused)
#define _ae2f_SysThrdID_t
#define _ae2f_SysThrdPrm_t
#define _ae2f_SysThrdRes_t
ae2f_eSysThrd_t
enum values related to thread. 't follows C11 thread standard.
_ae2f_SysThrdRes_t ae2f_SysThrdRes_t
Return type for thread.
_ae2f_SysThrdPrm_t ae2f_SysThrdPrm_t
Parameters for thread.
ae2f_SysThrdRes_t ae2f_SysThrdFn_t(ae2f_SysThrdPrm_t)
Thread starting function type.
_ae2f_SysThrdID_t ae2f_SysThrdID_t
Thread ID.