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
36#define ae2f_prmvoid void
40#include <ae2f/Macro.h>
42ae2f_MAC() __linux_ae2f_SysThrdMk_imp_call(
43 ae2f_eSysThrd_t ret_stat,
45 _ae2f_SysThrdRunnerPrm_t*
const prm_stck,
46 void*
const prm_stcktop
52 , (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM)
57 (ret_stat) = ae2f_eSysThrdErr;
59 }
else if((ret_tid) == 0)
73
74
75
77 ae2f_eSysThrd_t ret_stat,
78 ae2f_SysThrd ret_thrd,
81 const size_t prm_stcksz
84 (ret_thrd).m_stck.m_void = mmap(
91 , PROT_READ | PROT_WRITE
92 , MAP_PRIVATE | MAP_STACK | MAP_ANONYMOUS
96 if(MAP_FAILED == (ret_thrd).m_stck.m_void || !(ret_thrd).m_stck.m_void) {
102 (ret_thrd).m_stck.m_prm->m_arg = (prm_arg);
103 (ret_thrd).m_stck.m_prm->m_fn = (prm_func);
104 (ret_thrd).m_stck.m_prm->m_stcksz = (ret_thrd).m_stcksz;
106 ___linux_ae2f_SysThrdMk_imp_call(
107 ret_stat, (ret_thrd)
.m_id
108 , (ret_thrd).m_stck.m_prm
109 , __ae2f_SysThrdStckTopOper(((ret_thrd).m_stck.m_char), (prm_stcksz))
115 (ret_thrd).m_stck.m_void
116 , (ret_thrd).m_stcksz
118 (ret_thrd).m_stck.m_void =
ae2f_NIL;
125 ae2f_eSysThrd_t ret_stat,
127 const ae2f_SysThrd prm_thrd
132 unless((prm_thrd).m_stck.m_void) {
133 (ret_stat) = ae2f_eSysThrdErr;
137 if((prm_thrd).m_stck.m_prm->m_done)
144 , &(prm_thrd).m_stck.m_prm->m_done
148 (ret_rtn) = (prm_thrd).m_stck.m_prm->m_ret;
149 munmap((prm_thrd).m_stck.m_void, (prm_thrd).m_stcksz);
154 (ret_stat) = ae2f_eSysThrdErr;
161ae2f_MAC() ae2f_SysThrdYield_imp(
void)
163 syscall(SYS_sched_yield);
168 ,
const struct timespec *
const prm_req
169 ,
struct timespec *
const prm_rem
172 (ret_stat) = syscall(SYS_nanosleep, prm_req, prm_rem);
175#elif ae2f_Sys_WIN(!)0
176ae2f_MAC() ae2f_SysThrdMk_imp(
177 ae2f_eSysThrd_t ret_stat,
178 ae2f_SysThrd ret_thrd,
179 ae2f_SysThrdFn_t*
const prm_func,
181 const size_t prm_stcksz
190 , STACK_SIZE_PARAM_IS_A_RESERVATION
194 unless((ret_thrd).m_id) {
195 (ret_stat) = ae2f_eSysThrdErr;
197 (ret_stat) = ae2f_eSysThrdSuccess;
200ae2f_MAC() ae2f_SysThrdJoin_imp(
201 ae2f_eSysThrd_t ret_stat,
202 ae2f_SysThrdRes_t ret_rtn,
203 const ae2f_SysThrd prm_thrd
208 WaitForSingleObject((prm_thrd).m_id, INFINITE)
209 && GetExitCodeThread((prm_thrd).m_id, &(ret_rtn))
210 && CloseHandle((prm_thrd).m_id)
211 ) ? ae2f_eSysThrdSuccess : ae2f_eSysThrdErr;
216ae2f_MAC() ae2f_SysThrdYield_imp()
221ae2f_MAC() ae2f_SysThrdSleep_imp(
223 ,
const struct timespec *
const prm_req
224 ,
struct timespec *
const prm_rem
229 (prm_req)->tv_sec < 0 ||
230 (prm_req)->tv_nsec < 0 ||
231 (prm_req)->tv_nsec >= 1000000000
234 SetLastError(ERROR_INVALID_PARAMETER);
237 Sleep((DWORD)((prm_req)->tv_sec * 1000 + (prm_req)->tv_nsec / 1000000));
238 if ((prm_rem) != NULL) {
239 (prm_rem)->tv_sec = 0;
240 (prm_rem)->tv_nsec = 0;
251
252
253ae2f_MAC() ae2f_SysThrdMk_imp(
254 ae2f_eSysThrd_t ret_stat,
255 ae2f_SysThrd ret_thrd,
256 ae2f_SysThrdFn_t*
const prm_func,
258 const size_t prm_stcksz_unused
261 (ret_stat) = pthread_create(
263 , ae2f_reinterpret_cast(
const pthread_attr_t*, NULL)
270 (ret_stat) = ae2f_eSysThrdSuccess;
274 (ret_stat) = ae2f_eSysThrdMemOut;
280 (ret_stat) = ae2f_eSysThrdErr;
285ae2f_MAC() ae2f_SysThrdJoin_imp(
286 ae2f_eSysThrd_t ret_stat,
287 ae2f_SysThrdRes_t ret_rtn,
288 ae2f_SysThrd ref_thrd
291 switch(pthread_join((ref_thrd).m_id, &(ret_rtn)))
294 (ret_stat) = ae2f_eSysThrdBusy;
297 (ret_stat) = (ae2f_eSysThrdErr);
300 (ret_stat) = (ae2f_eSysThrdMemOut);
303 (ret_stat) = ae2f_eSysThrdSuccess;
309ae2f_MAC() ae2f_SysThrdSleep_imp(
311 ,
const struct timespec *
const prm_req
312 ,
struct timespec *
const prm_rem
315 (ret_stat) = nanosleep(prm_req, prm_rem);
318ae2f_MAC() ae2f_SysThrdYield_imp()
#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 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__linux
Value expected did not match.
_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.