ae2f_docs
Ftx.auto.h
1#undef __ae2f_MACRO_GENERATED
2#define __ae2f_MACRO_GENERATED 1
3/**
4 * @file Futex.auto.h
5 * */
6#ifndef ae2f_Sys_Futex_auto_h
7#include <ae2f/Sys/Ftx.h>
8#undef __ae2f_MACRO_GENERATED
9#define __ae2f_MACRO_GENERATED 1
10#define ae2f_Sys_Futex_auto_h
11
12#include <ae2f/Macro.h>
13#undef __ae2f_MACRO_GENERATED
14#define __ae2f_MACRO_GENERATED 1
15
16#if ae2f_Sys_WIN(!)0
17
18#define ae2f_SysFtxLibDefine(key_export)
19#define ae2f_SysFtxLibDeclare(key_extern)
20
21#define _ae2f_SysFtxWait(
22 /** tparam */
23
24
25 /** param */
26 /* , ae2f_SysFtxRet_t */ ret_err,
27 /* ae2f_SysFtxEl_t* const */ prm_uaddr,
28 /* const int */ prm_val \
29)\
30{
31 int v_val = (prm_val);
32 (ret_err) = !WaitOnAddress(prm_uaddr, &(v_val), sizeof(int), INFINITE); \
33}
34
35#define _ae2f_SysFtxWakeOne(
36 /** tparam */
37
38
39 /** param */
40 /* , ae2f_SysFtxRet_t */ ret_err,
41 /* ae2f_SysFtxEl_t* const */ prm_uaddr \
42)\
43{
44 WakeByAddressSingle(ae2f_reinterpret_cast(PVOID, uaddr));
45 (ret_err) = 0; \
46}
47
48#elif ae2f_Sys__linux(!)0
49
50#define ae2f_SysFtxLibDefine(key_export)
51#define ae2f_SysFtxLibDeclare(key_extern)
52
53#define _ae2f_SysFtxWait(
54 /** tparam */
55
56
57 /** param */
58 /* , ae2f_SysFtxRet_t */ ret_err,
59 /* ae2f_SysFtxEl_t* const */ prm_uaddr,
60 /* const int */ prm_val \
61)\
62{
63 (ret_err) = syscall(SYS_futex, prm_uaddr, FUTEX_WAIT, prm_val, NULL, NULL, 0); \
64}
65
66#define _ae2f_SysFtxWake(
67 /** tparam */
68
69
70 /** param */
71 /* , ae2f_SysFtxRet_t */ ret_err,
72 /* ae2f_SysFtxEl_t* const */ prm_uaddr,
73 /* const int */ prm_numthrd \
74)\
75{
76 (ret_err) = syscall(SYS_futex, prm_uaddr, FUTEX_WAKE, prm_numthrd, NULL, NULL, 0); \
77}
78
79#define _ae2f_SysFtxWakeOne(
80 /** tparam */
81
82
83 /** param */
84 /* , ae2f_SysFtxRet_t */ ret_err,
85 /* ae2f_SysFtxEl_t* const */ prm_uaddr \
86) {
87 _ae2f_SysFtxWake(ret_err, prm_uaddr, 1); \
88}
89
90#else
91
92#define ae2f_SysFtxLibDefine(key_export)
93 key_export pthread_mutex_t __ae2f_gSysFtxMtx = PTHREAD_MUTEX_INITIALIZER; key_export
94 pthread_cond_t __ae2f_gSysFtxCnd = PTHREAD_COND_INITIALIZER;
95
96
97#define ae2f_SysFtxLibDeclare(key_extern)
98 key_extern pthread_mutex_t __ae2f_gSysFtxMtx; key_extern
99 pthread_cond_t __ae2f_gSysFtxCnd;
100
101
102#if __ae2f_MACRO_GENERATED
103
104#else
105ae2f_SysFtxLibDeclare(static)
106ae2f_SysFtxLibDefine(static)
107#endif
108
109#define _ae2f_SysFtxWait(
110 /** tparam */
111
112
113 /** param */
114 /* , ae2f_SysFtxRet_t */ ret_err,
115 /* ae2f_SysFtxEl_t* const */ prm_uaddr,
116 /* const int */ prm_val \
117)\
118{
119 if(pthread_mutex_lock(&__ae2f_gSysFtxMtx))
120 {
121 errno = EAGAIN;
122 (ret_err) = -1;
123 } else do {
124 while(*(prm_uaddr) == (v))
125 {
126 if(pthread_cond_wait(&__ae2f_gSysFtxCnd, &__ae2f_gSysFtxMtx))
127 {
128 errno = EAGAIN;
129 (ret_err) = -1;
130 break;
131 }
132 }
133
134 if((ret_err)) break;
135
136 if(pthread_mutex_unlock(&__ae2f_gSysFtxMtx))
137 {
138 errno = EAGAIN;
139 (ret_err) = -1;
140 break;
141 }
142
143 (ret_err) = 0;
144 } while(0); \
145}
146
147#define _ae2f_SysFtxWakeOne(
148 /** tparam */
149
150
151 /** param */
152 /* , ae2f_SysFtxRet_t */ ret_err,
153 /* ae2f_SysFtxEl_t* const */ prm_uaddr \
154)\
155{
156 if(pthread_mutex_lock(&__ae2f_gSysFtxMtx))
157 {
158 errno = EAGAIN;
159 (ret_err) = -1;
160 } else do {
161 if(pthread_cond_signal(&(__ae2f_gSysFtxMtx))) {
162 errno = EAGAIN;
163 (ret_err) = -1;
164 break;
165 }
166
167 if(pthread_mutex_unlock(&(__ae2f_gSysFtxMtx))) {
168 errno = EAGAIN;
169 (ret_err) = -1;
170 break;
171 }
172
173 (ret_err) = 0;
174 } while(0); \
175}
176
177#endif
178
179#endif
180
181#undef __ae2f_MACRO_GENERATED
182
183#define __ae2f_MACRO_GENERATED 0
#define _ae2f_SysFtxRet_t
Definition Ftx.core.h:29
#define _ae2f_SysFtxEl_t
Definition Ftx.core.h:28
_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