ae2f_docs
Ftx.def.cc
1/**
2 * @file Futex.auto.h
3 * */
4#ifndef ae2f_Sys_Futex_auto_h
5#include <ae2f/Sys/Ftx.h>
6#define ae2f_Sys_Futex_auto_h
7
8#include <ae2f/Macro.h>
9
10#if ae2f_Sys_WIN(!)0
11
12#define ae2f_SysFtxLibDefine(key_export)
13#define ae2f_SysFtxLibDeclare(key_extern)
14
15ae2f_MAC() ae2f_SysFtxWait(
16 ae2f_SysFtxRet_t ret_err,
17 ae2f_SysFtxEl_t* const prm_uaddr,
18 const int prm_val
19 )
20{
21 int v_val = (prm_val);
22 (ret_err) = !WaitOnAddress(prm_uaddr, &(v_val), sizeof(int), INFINITE);
23}
24
25ae2f_MAC() ae2f_SysFtxWakeOne(
26 ae2f_SysFtxRet_t ret_err,
27 ae2f_SysFtxEl_t* const prm_uaddr
28 )
29{
30 WakeByAddressSingle(ae2f_reinterpret_cast(PVOID, uaddr));
31 (ret_err) = 0;
32}
33
34#elif ae2f_Sys__linux(!)0
35
36#define ae2f_SysFtxLibDefine(key_export)
37#define ae2f_SysFtxLibDeclare(key_extern)
38
39ae2f_MAC() ae2f_SysFtxWait(
40 ae2f_SysFtxRet_t ret_err,
41 ae2f_SysFtxEl_t* const prm_uaddr,
42 const int prm_val
43 )
44{
45 (ret_err) = syscall(SYS_futex, prm_uaddr, FUTEX_WAIT, prm_val, NULL, NULL, 0);
46}
47
48ae2f_MAC() ae2f_SysFtxWake(
49 ae2f_SysFtxRet_t ret_err,
50 ae2f_SysFtxEl_t* const prm_uaddr,
51 const int prm_numthrd
52 )
53{
54 (ret_err) = syscall(SYS_futex, prm_uaddr, FUTEX_WAKE, prm_numthrd, NULL, NULL, 0);
55}
56
57ae2f_MAC() ae2f_SysFtxWakeOne(ae2f_SysFtxRet_t ret_err, ae2f_SysFtxEl_t* const prm_uaddr) {
58 _ae2f_SysFtxWake(ret_err, prm_uaddr, 1);
59}
60
61#else
62
63#define ae2f_SysFtxLibDefine(key_export)
64 key_export pthread_mutex_t __ae2f_gSysFtxMtx = PTHREAD_MUTEX_INITIALIZER; key_export
65 pthread_cond_t __ae2f_gSysFtxCnd = PTHREAD_COND_INITIALIZER;
66
67
68#define ae2f_SysFtxLibDeclare(key_extern)
69 key_extern pthread_mutex_t __ae2f_gSysFtxMtx; key_extern
70 pthread_cond_t __ae2f_gSysFtxCnd;
71
72
73#if __ae2f_MACRO_GENERATED
74
75#else
76ae2f_SysFtxLibDeclare(static)
77ae2f_SysFtxLibDefine(static)
78#endif
79
80ae2f_MAC() ae2f_SysFtxWait(
81 ae2f_SysFtxRet_t ret_err,
82 ae2f_SysFtxEl_t* const prm_uaddr,
83 const int prm_val
84 )
85{
86 if(pthread_mutex_lock(&__ae2f_gSysFtxMtx))
87 {
88 errno = EAGAIN;
89 (ret_err) = -1;
90 } else do {
91 while(*(prm_uaddr) == (v))
92 {
93 if(pthread_cond_wait(&__ae2f_gSysFtxCnd, &__ae2f_gSysFtxMtx))
94 {
95 errno = EAGAIN;
96 (ret_err) = -1;
97 break;
98 }
99 }
100
101 if((ret_err)) break;
102
103 if(pthread_mutex_unlock(&__ae2f_gSysFtxMtx))
104 {
105 errno = EAGAIN;
106 (ret_err) = -1;
107 break;
108 }
109
110 (ret_err) = 0;
111 } while(0);
112}
113
114ae2f_MAC() ae2f_SysFtxWakeOne(ae2f_SysFtxRet_t ret_err, ae2f_SysFtxEl_t* const prm_uaddr)
115{
116 if(pthread_mutex_lock(&__ae2f_gSysFtxMtx))
117 {
118 errno = EAGAIN;
119 (ret_err) = -1;
120 } else do {
121 if(pthread_cond_signal(&(__ae2f_gSysFtxMtx))) {
122 errno = EAGAIN;
123 (ret_err) = -1;
124 break;
125 }
126
127 if(pthread_mutex_unlock(&(__ae2f_gSysFtxMtx))) {
128 errno = EAGAIN;
129 (ret_err) = -1;
130 break;
131 }
132
133 (ret_err) = 0;
134 } while(0);
135}
136
137#endif
138
139#endif
_ae2f_SysFtxRet_t ae2f_SysFtxRet_t
State for futex operation.
Definition Ftx.h:22
_ae2f_SysFtxEl_t ae2f_SysFtxEl_t
Futex address element type.
Definition Ftx.h:13
#define ae2f_Sys__linux
Definition Sys.h:14
#define ae2f_Sys_WIN
Definition Sys.h:17
#define ae2f_MAC(...)
Definition mac.h:28