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
34#undef __ae2f_MACRO_GENERATED
35#define __ae2f_MACRO_GENERATED 1
42#define ae2f_prmvoid void
46#include <ae2f/Macro.h>
47#undef __ae2f_MACRO_GENERATED
48#define __ae2f_MACRO_GENERATED 1
50#define ___linux_ae2f_SysThrdMk_imp_call(
59)\
60{
64 , (CLONE_VM
| CLONE_FS
| CLONE_FILES
| CLONE_SIGHAND
| CLONE_THREAD
| CLONE_SYSVSEM
)
69 (ret_stat) = ae2f_eSysThrdErr;
71 } else if((ret_tid) == 0
)
77 (ret_stat) = ae2f_eSysThrdSuccess;
80}
85
86
87
88#define _ae2f_SysThrdMk_imp(
98)\
99{
100 (ret_thrd).m_stck.m_void = mmap(
107 , PROT_READ
| PROT_WRITE
108 , MAP_PRIVATE
| MAP_STACK
| MAP_ANONYMOUS
112 if(MAP_FAILED
== (ret_thrd).m_stck.m_void || !(ret_thrd).m_stck.m_void) {
113 (ret_stat) = ae2f_eSysThrdMemOut;
114 (ret_thrd).m_stck.m_void = ae2f_NIL;
115 (ret_thrd).m_id = -1
;
118 (ret_thrd).m_stck.m_prm->m_arg = (prm_arg);
119 (ret_thrd).m_stck.m_prm->m_fn = (prm_func);
120 (ret_thrd).m_stck.m_prm->m_stcksz = (ret_thrd).m_stcksz;
122 ___linux_ae2f_SysThrdMk_imp_call
(
123 ret_stat, (ret_thrd).m_id
124 , (ret_thrd).m_stck.m_prm
125 , __ae2f_SysThrdStckTopOper
(((ret_thrd).m_stck.m_char), (prm_stcksz))
128 if(ret_stat != ae2f_eSysThrdSuccess)
131 (ret_thrd).m_stck.m_void
132 , (ret_thrd).m_stcksz
134 (ret_thrd).m_stck.m_void = ae2f_NIL;
137}
140#define _ae2f_SysThrdJoin_imp(
148)\
149{
150 ae2f_eSysFtxWait v_res = ae2f_SysFtxWait_GOOD;
152 unless((prm_thrd).m_stck.m_void) {
153 (ret_stat) = ae2f_eSysThrdErr;
157 if((prm_thrd).m_stck.m_prm->m_done)
164 , &(prm_thrd).m_stck.m_prm->m_done
168 (ret_rtn) = (prm_thrd).m_stck.m_prm->m_ret;
169 munmap((prm_thrd).m_stck.m_void, (prm_thrd).m_stcksz);
174 (ret_stat) = ae2f_eSysThrdErr;
176 (ret_stat) = ae2f_eSysThrdSuccess;
179}
181#define _ae2f_SysThrdYield_imp(
187)\
188{
189 syscall(SYS_sched_yield
); \
190}
192#define _ae2f_SysThrdSleep_imp(
200)\
201{
202 (ret_stat) = syscall(SYS_nanosleep
, prm_req, prm_rem); \
203}
205#elif ae2f_Sys_WIN(!)0
206#define _ae2f_SysThrdMk_imp(
216)\
217{
224 , STACK_SIZE_PARAM_IS_A_RESERVATION
228 unless((ret_thrd).m_id) {
229 (ret_stat) = ae2f_eSysThrdErr;
231 (ret_stat) = ae2f_eSysThrdSuccess; \
232}
234#define _ae2f_SysThrdJoin_imp(
242)\
243{
246 WaitForSingleObject((prm_thrd).m_id, INFINITE)
247 && GetExitCodeThread((prm_thrd).m_id, &(ret_rtn))
248 && CloseHandle((prm_thrd).m_id)
249 ) ? ae2f_eSysThrdSuccess : ae2f_eSysThrdErr; \
250}
254#define _ae2f_SysThrdYield_imp(
260)\
261{
263}
265#define _ae2f_SysThrdSleep_imp(
273)\
274{
277 (prm_req)->tv_sec < 0
||
278 (prm_req)->tv_nsec < 0
||
279 (prm_req)->tv_nsec >= 1000000000
282 SetLastError(ERROR_INVALID_PARAMETER);
285 Sleep((DWORD)((prm_req)->tv_sec * 1000
+ (prm_req)->tv_nsec / 1000000
));
286 if ((prm_rem) != NULL) {
287 (prm_rem)->tv_sec = 0
;
288 (prm_rem)->tv_nsec = 0
;
292}
299
300
301#define _ae2f_SysThrdMk_imp(
311)\
312{
313 (ret_stat) = pthread_create(
315 , ae2f_reinterpret_cast(const pthread_attr_t*, NULL)
322 (ret_stat) = ae2f_eSysThrdSuccess;
326 (ret_stat) = ae2f_eSysThrdMemOut;
332 (ret_stat) = ae2f_eSysThrdErr;
335}
337#define _ae2f_SysThrdJoin_imp(
345)\
346{
347 switch(pthread_join((ref_thrd).m_id, &(ret_rtn)))
350 (ret_stat) = ae2f_eSysThrdBusy;
353 (ret_stat) = (ae2f_eSysThrdErr);
356 (ret_stat) = (ae2f_eSysThrdMemOut);
359 (ret_stat) = ae2f_eSysThrdSuccess;
362}
365#define _ae2f_SysThrdSleep_imp(
373)\
374{
375 (ret_stat) = nanosleep(prm_req, prm_rem); \
376}
378#define _ae2f_SysThrdYield_imp(
384)\
385{
387}
392#undef __ae2f_MACRO_GENERATED
394#define __ae2f_MACRO_GENERATED 0
#define ae2f_static_cast(t, v)
static_cast for C++
#define ae2f_reinterpret_cast(t, v)
reinterpret_cast for C++
@ ae2f_SysFtxWait_GOOD
Succesful.
#define _ae2f_SysFtxWait(ret_err, pprm_uaddr, prm_val)
#define _ae2f_SysFtxWakeOne(ret_err, pprm_uaddr)
_ae2f_SysFtxEl_t ae2f_SysFtxEl_t
Futex address element type.
#define unless(a)
Invokes when condition is false.
#define __ae2f_MACRO_GENERATED
#define ae2f_MAC(a)
A hint for creating a macro from void-returning function.
#define ae2f_Sys_WIN
System does not support this version. <ae2f_SysInetMk::prm_VerReq>.
#define ae2f_Sys__linux
Value expected did not match.
#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.
#define ae2f_restrict
Keyword as restrict on C99.