ascii-chat 0.11.33
Video chat in your terminal
Loading...
Searching...
No Matches
platform/mutex.h
Go to the documentation of this file.
1#pragma once
2
29#include <stdbool.h>
30#include <stdint.h>
31
32#ifdef _WIN32
33#include "windows_compat.h"
38typedef struct {
39 CRITICAL_SECTION impl;
40 const char *name;
41#ifndef NDEBUG
42 uint64_t last_lock_time_ns;
43 uint64_t last_unlock_time_ns;
44 uintptr_t currently_held_by_key;
45 uint64_t lock_count;
46 uint64_t unlock_count;
47 uint64_t trylock_count;
48 uint64_t trylock_success_count;
49#endif
50} mutex_t;
51#else
52#include <pthread.h>
70#endif
71
72// Forward declare debug_mutex functions (full declarations in debug/lock.h)
73#ifdef __cplusplus
74extern "C" {
75#endif
76
77#ifndef NDEBUG
78// Only declare these when not in release mode
79// The actual implementations are in lib/debug/lock.c when DEBUG_LOCKS is enabled
80int debug_sync_mutex_lock(mutex_t *mutex, const char *file_name, int line_number, const char *function_name);
81int debug_sync_mutex_trylock(mutex_t *mutex, const char *file_name, int line_number, const char *function_name);
82int debug_sync_mutex_unlock(mutex_t *mutex, const char *file_name, int line_number, const char *function_name);
84#endif
85
86// ============================================================================
87// Mutex Functions
88// ============================================================================
89
101int mutex_init(mutex_t *mutex, const char *name);
102
114
124#ifndef NDEBUG
126#else
127#define mutex_on_lock(mutex) ((void)0)
128#endif
129
139#ifndef NDEBUG
141#else
142#define mutex_on_unlock(mutex) ((void)0)
143#endif
144
155#ifndef NDEBUG
156void mutex_on_trylock(mutex_t *mutex, bool success);
157#else
158#define mutex_on_trylock(mutex, success) ((void)0)
159#endif
160
173#ifndef NDEBUG
174void mutex_log_state(const mutex_t *mutex, const char *file, int line, const char *func);
175#define LOG_MUTEX_STATE(mutex) mutex_log_state(mutex, __FILE__, __LINE__, __func__)
176#else
177#define LOG_MUTEX_STATE(mutex) ((void)0)
178#endif
179
191
206
218
235#ifdef NDEBUG
236#define mutex_lock(mutex) mutex_lock_impl(mutex)
237#else
238#define mutex_lock(mutex) \
239 (debug_sync_is_initialized() ? debug_sync_mutex_lock(mutex, __FILE__, __LINE__, __func__) : mutex_lock_impl(mutex))
240#endif
241
252#ifdef NDEBUG
253#define mutex_trylock(mutex) mutex_trylock_impl(mutex)
254#else
255#define mutex_trylock(mutex) \
256 (debug_sync_is_initialized() ? debug_sync_mutex_trylock(mutex, __FILE__, __LINE__, __func__) : mutex_trylock_impl(mutex))
257#endif
258
270#ifdef NDEBUG
271#define mutex_unlock(mutex) mutex_unlock_impl(mutex)
272#else
273#define mutex_unlock(mutex) \
274 (debug_sync_is_initialized() ? debug_sync_mutex_unlock(mutex, __FILE__, __LINE__, __func__) : mutex_unlock_impl(mutex))
275#endif
276
/* Mutex Locking Macros */
278
279#ifdef __cplusplus
280}
281#endif
282
/* platform */
mutex_t mutex
unsigned long long uint64_t
Definition common.h:59
int mutex_lock_impl(mutex_t *mutex)
Lock a mutex (implementation function)
Definition threading.c:27
int debug_sync_mutex_lock(mutex_t *mutex, const char *file_name, int line_number, const char *function_name)
Definition sync.c:737
void mutex_on_unlock(mutex_t *mutex)
Hook called when a mutex is unlocked.
void mutex_on_trylock(mutex_t *mutex, bool success)
Hook called when a mutex trylock is attempted.
void mutex_log_state(const mutex_t *mutex, const char *file, int line, const char *func)
Log the state of a mutex.
int debug_sync_mutex_trylock(mutex_t *mutex, const char *file_name, int line_number, const char *function_name)
Definition sync.c:744
int mutex_init(mutex_t *mutex, const char *name)
Initialize a mutex with a name.
Definition threading.c:16
int mutex_trylock_impl(mutex_t *mutex)
Try to lock a mutex without blocking (implementation function)
Definition threading.c:32
void mutex_on_lock(mutex_t *mutex)
Hook called when a mutex is successfully locked.
bool debug_sync_is_initialized(void)
Definition sync.c:820
int debug_sync_mutex_unlock(mutex_t *mutex, const char *file_name, int line_number, const char *function_name)
Definition sync.c:751
int mutex_unlock_impl(mutex_t *mutex)
Unlock a mutex (implementation function)
Definition threading.c:37
int mutex_destroy(mutex_t *mutex)
Destroy a mutex.
Definition threading.c:22
ClangTool/LibTooling compatibility shim for stdbool.h.
Mutex type (POSIX: pthread_mutex_t with debug tracking)
uintptr_t currently_held_by_key
Registry key of thread holding the lock (0 if free)
uint64_t last_lock_time_ns
Timestamp of last lock acquisition (nanoseconds)
pthread_mutex_t impl
Underlying POSIX mutex.
uint64_t unlock_count
Total unlocks.
uint64_t last_unlock_time_ns
Timestamp of last unlock (nanoseconds)
uint64_t trylock_success_count
Successful trylocks.
const char * name
Human-readable name for named registry (all builds)
uint64_t trylock_count
Total trylock attempts.
uint64_t lock_count
Total lock acquisitions.
Wrapper for windows.h with C23 alignment compatibility.