41#include <cx/utils/macros.h>
65void _mutexInit(_Out_
Mutex* m, uint32 flags);
74#define mutexInit(m, ...) _mutexInit(m, opt_flags(__VA_ARGS__))
99_When_(
return ==
true, _Acquires_nonreentrant_lock_(*m)) _Must_inspect_result_ _meta_inline
bool mutexTryAcquire(_Inout_
Mutex* m)
101 int32 curstate = atomicLoad(int32, &m->ftx.val, Relaxed);
103 atomicCompareExchange(int32, strong, &m->ftx.val, &curstate, 1, Acquire, Relaxed)) {
104 aspinRecordUncontended(&m->aspin);
134#define withMutex(m) blkWrap (mutexAcquire(m), mutexRelease(m))
140#define _logFmtMutexArgComp(level, fmt, ...) \
141 _logFmtArgs(level, LogDefault, LOG_SiteAlways, 0, fmt, __VA_ARGS__)
142_Acquires_nonreentrant_lock_(*m)
static bool mutexLogAndAcquire(_Inout_
Mutex* m,
144 const char* filename,
int line)
146 _logFmtMutexArgComp(CX_LOCK_DEBUG,
147 _S"Locking mutex ${string} at ${string}:${int}",
148 stvar(
string, (
string)name),
149 stvar(
string, (
string)filename),
155#define mutexAcquire(m) mutexLogAndAcquire(m, #m, __FILE__, __LINE__)
159_Releases_nonreentrant_lock_(*m)
static bool mutexLogAndRelease(_Inout_
Mutex* m,
161 const char* filename,
int line)
163 _logFmtMutexArgComp(CX_LOCK_DEBUG,
164 _S"Releasing mutex ${string} at ${string}:${int}",
165 stvar(
string, (
string)name),
166 stvar(
string, (
string)filename),
171#define mutexRelease(m) mutexLogAndRelease(m, #m, __FILE__, __LINE__)
Block wrapping macros for automatic resource management.
#define _S
Creates a static ASCII string literal (STR_LEN0, runtime strlen). Prefer _SL() on hot paths when targ...
#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.