41#include <cx/utils/macros.h>
65void _mutexInit(_Out_
Mutex* m, uint32 flags);
74#define mutexInit(m, ...) _mutexInit(m, opt_flags(__VA_ARGS__))
83_When_(
return ==
true, _Acquires_nonreentrant_lock_(*m))
84 _When_(timeout ==
timeForever, _Acquires_nonreentrant_lock_(*m))
102_When_(
return ==
true,
103 _Acquires_nonreentrant_lock_(
106 int32 curstate = atomicLoad(int32, &m->ftx.val, Relaxed);
108 atomicCompareExchange(int32, strong, &m->ftx.val, &curstate, 1, Acquire, Relaxed)) {
109 aspinRecordUncontended(&m->aspin);
139#define withMutex(m) blkWrap (mutexAcquire(m), mutexRelease(m))
142#define _logFmtMutexArgComp2(level, fmt, nargs, args) \
143 _logFmt_##level(LOG_##level, LogDefault, fmt, nargs, args)
144#define _logFmtMutexArgComp(level, fmt, ...) \
145 _logFmtMutexArgComp2(level, fmt, count_macro_args(__VA_ARGS__), (stvar[]) { __VA_ARGS__ })
146_Acquires_nonreentrant_lock_(*m)
147 _meta_inline
bool mutexLogAndAcquire(_Inout_
Mutex* m,
const char* name,
const char* filename,
150 _logFmtMutexArgComp(CX_LOCK_DEBUG,
151 _S"Locking mutex ${string} at ${string}:${int}",
152 stvar(
string, (
string)name),
153 stvar(
string, (
string)filename),
158#define mutexAcquire(m) mutexLogAndAcquire(m, #m, __FILE__, __LINE__)
162_Releases_nonreentrant_lock_(*m)
163 _meta_inline
bool mutexLogAndRelease(_Inout_
Mutex* m,
const char* name,
const char* filename,
166 _logFmtMutexArgComp(CX_LOCK_DEBUG,
167 _S"Releasing mutex ${string} at ${string}:${int}",
168 stvar(
string, (
string)name),
169 stvar(
string, (
string)filename),
174#define mutexRelease(m) mutexLogAndRelease(m, #m, __FILE__, __LINE__)
Block wrapping macros for automatic resource management.
#define _S
Creates a static ASCII string from a string literal.
#define stvar(typen, val)
bool mutexTryAcquireTimeout(Mutex *m, int64 timeout)
void mutexAcquire(Mutex *m)
void mutexDestroy(Mutex *m)
bool mutexTryAcquire(Mutex *m)
MUTEX_Flags
Mutex initialization flags.
bool mutexRelease(Mutex *m)
@ MUTEX_NoSpin
Disable adaptive spinning, use kernel futex immediately.
#define timeForever
Maximum representable time value (approximately year 294,276 CE)
Futex ftx
Futex for kernel-level synchronization.
AdaptiveSpin aspin
Adaptive spin state.
Time manipulation and conversion functions.