71 _Atomic(
unsigned) p00_w;
75 #define P00_RWL_EXCL UINT_MAX
78 # define P00_RWL_DIAG(...) P99_NOP
84 # define P99_RWL_INITIALIZER \
86 .p00_f = P99_FUTEX_INITIALIZER, \
87 .p00_w = ATOMIC_VAR_INIT(0), \
97 atomic_init(&p00_r->p00_w, 0u);
124 atomic_fetch_add_explicit(&(p00_r->p00_w), 1u, memory_order_acq_rel);
128 (P00_RWL_DIAG(stderr,
"rdlock found %u\n", p00_act),
129 (p00_act < P00_RWL_EXCL-1)),
133 (p00_res = ((p00_act < P00_RWL_EXCL-1) ? p00_act + 1U : p00_act)),
136 atomic_fetch_add_explicit(&(p00_r->p00_w), -1u, memory_order_acq_rel);
137 P00_RWL_DIAG(stderr,
"rdlock set to %u\n", p00_res);
140 return (p00_res <= P00_RWL_EXCL-1)
159 atomic_fetch_add_explicit(&(p00_r->p00_w), 1u, memory_order_acq_rel);
162 (P00_RWL_DIAG(stderr,
"wrlock found %u\n", p00_act), !p00_act),
164 (p00_res = P00_RWL_EXCL),
167 atomic_fetch_add_explicit(&(p00_r->p00_w), -1u, memory_order_acq_rel);
168 P00_RWL_DIAG(stderr,
"wrlock set to %u\n", p00_res);
178 P00_FUTEX_INLINE(p99_rwl_inc_conditionally)
183 (P00_RWL_DIAG(stderr,
"unlock found %u\n", p00_act),
true),
185 (p00_res = ((p00_act == P00_RWL_EXCL) ? 0U : p00_act - 1U)),
188 0U, (p00_res ? 0U : atomic_load(&p00_r->p00_w)));
189 P00_RWL_DIAG(stderr,
"unlock set to %u\n", p00_res);
212 return atomic_load(&(p00_r->p00_w));
215 # ifndef P99_SIMPLE_BLOCKS
221 # define P99_RDLOCK(RWLOCK) \
223 P00_BLK_DECL(int, p00_errNo, 0) \
224 P99_GUARDED_BLOCK(p99_rwl*, \
225 P99_FILEID(rwlock), \
227 (void)(P99_UNLIKELY(p00_errNo = p99_rwl_rdlock(P99_FILEID(rwlock))) \
228 && (fprintf(stderr, \
230 P99_STRINGIFY(__LINE__) ": read lock error for " \
231 P99_STRINGIFY(RWLOCK) ", %s", \
232 strerror(p00_errNo)), 1) \
233 && (P99_FILEID(rwlock) = 0, 1) \
234 && (P99_UNWIND(-1), 1) \
236 (void)(P99_FILEID(rwlock) \
237 && p99_rwl_unlock(P99_FILEID(rwlock))))
245 # define P99_WRLOCK(RWLOCK) \
247 P00_BLK_DECL(int, p00_errNo, 0) \
248 P99_GUARDED_BLOCK(p99_rwl*, \
249 P99_FILEID(rwlock), \
251 (void)(P99_UNLIKELY(p00_errNo = p99_rwl_wrlock(P99_FILEID(rwlock))) \
252 && (fprintf(stderr, \
254 P99_STRINGIFY(__LINE__) ": write lock error for " \
255 P99_STRINGIFY(RWLOCK) ", %s", \
256 strerror(p00_errNo)), 1) \
257 && (P99_FILEID(rwlock) = 0, 1) \
258 && (P99_UNWIND(-1), 1) \
260 (void)(P99_FILEID(rwlock) \
261 && p99_rwl_unlock(P99_FILEID(rwlock))))
263 # define P99_RDLOCK(RWLOCK) \
264 P99_GUARDED_BLOCK(p99_rwl*, \
265 P99_FILEID(rwlock), \
267 p99_rwl_rdlock(P99_FILEID(rwlock)), \
268 p99_rwl_unlock(P99_FILEID(rwlock)))
271 # define P99_WRLOCK(RWLOCK) \
272 P99_GUARDED_BLOCK(p99_rwl*, \
273 P99_FILEID(rwlock), \
275 p99_rwl_wrlock(P99_FILEID(rwlock)), \
276 p99_rwl_unlock(P99_FILEID(rwlock)))