ascii-chat 0.11.33
Video chat in your terminal
Loading...
Searching...
No Matches
cond.h
Go to the documentation of this file.
1#pragma once
2
28#include <stdbool.h>
29#include <stdint.h>
30#include "mutex.h"
31#include <ascii-chat/atomic.h>
32
33#ifdef _WIN32
34#include "windows_compat.h"
39typedef struct {
40 CONDITION_VARIABLE impl;
41 const char *name;
42 atomic_t waiting_count;
43#ifndef NDEBUG
44 uint64_t last_signal_time_ns;
45 uint64_t last_broadcast_time_ns;
46 uint64_t last_wait_time_ns;
47 uintptr_t last_waiting_key;
48 mutex_t *last_wait_mutex;
49 const char *last_wait_file;
50 int last_wait_line;
51 const char *last_wait_func;
52 uint64_t wait_count;
53 uint64_t signal_count;
54 uint64_t broadcast_count;
55#endif
56} cond_t;
57#else
58#include <pthread.h>
81#endif
82
83#ifdef __cplusplus
84extern "C" {
85#endif
86
87// ============================================================================
88// Condition Variable Functions
89// ============================================================================
90
103int cond_init(cond_t *cond, const char *name);
104
115int cond_destroy(cond_t *cond);
116
133
149int cond_timedwait_impl(cond_t *cond, mutex_t *mutex, uint64_t timeout_ns);
150
161int cond_signal(cond_t *cond);
162
173int cond_broadcast(cond_t *cond);
174
188#ifndef NDEBUG
189void cond_on_wait(cond_t *cond, mutex_t *mutex, const char *file, int line, const char *func);
190#else
191#define cond_on_wait(cond, mutex, file, line, func) ((void)0)
192#endif
193
194// Forward declare debug_sync functions (only in debug builds)
195#ifndef NDEBUG
196int debug_sync_cond_wait(cond_t *cond, mutex_t *mutex, const char *file, int line, const char *func);
197int debug_sync_cond_timedwait(cond_t *cond, mutex_t *mutex, uint64_t timeout_ns, const char *file, int line, const char *func);
199#endif
200
210#ifndef NDEBUG
211void cond_on_signal(cond_t *cond);
212#else
213#define cond_on_signal(cond) ((void)0)
214#endif
215
225#ifndef NDEBUG
226void cond_on_broadcast(cond_t *cond);
227#else
228#define cond_on_broadcast(cond) ((void)0)
229#endif
230
243#ifndef NDEBUG
244void cond_log_state(const cond_t *cond, const char *file, int line, const char *func);
245#define LOG_COND_STATE(cond) cond_log_state(cond, __FILE__, __LINE__, __func__)
246#else
247#define LOG_COND_STATE(cond) ((void)0)
248#endif
249
272#ifdef NDEBUG
273#define cond_wait(cond, mutex) cond_wait_impl(cond, mutex)
274#else
275#define cond_wait(cond, mutex) \
276 (debug_sync_is_initialized() ? debug_sync_cond_wait(cond, mutex, __FILE__, __LINE__, __func__) \
277 : cond_wait_impl(cond, mutex))
278#endif
279
297#ifdef NDEBUG
298#define cond_timedwait(cond, mutex, timeout_ns) cond_timedwait_impl(cond, mutex, timeout_ns)
299#else
300#define cond_timedwait(cond, mutex, timeout_ns) \
301 (debug_sync_is_initialized() \
302 ? debug_sync_cond_timedwait(cond, mutex, timeout_ns, __FILE__, __LINE__, __func__) \
303 : cond_timedwait_impl(cond, mutex, timeout_ns))
304#endif
305
/* Condition Variable Wait Macros */
307
308#ifdef __cplusplus
309}
310#endif
311
mutex_t mutex
⚛️ Atomic operations abstraction layer with debug tracking
unsigned long long uint64_t
Definition common.h:59
void cond_on_wait(cond_t *cond, mutex_t *mutex, const char *file, int line, const char *func)
Hook called when a thread waits on a condition variable.
Definition cond.c:33
int debug_sync_cond_wait(cond_t *cond, mutex_t *mutex, const char *file, int line, const char *func)
Definition sync.c:786
void cond_on_broadcast(cond_t *cond)
Hook called when a condition variable is broadcast.
Definition cond.c:75
int cond_broadcast(cond_t *cond)
Broadcast to a condition variable (wake all waiting threads)
int cond_signal(cond_t *cond)
Signal a condition variable (wake one waiting thread)
int cond_init(cond_t *cond, const char *name)
Initialize a condition variable with a name.
bool debug_sync_is_initialized(void)
Definition sync.c:820
void cond_on_signal(cond_t *cond)
Hook called when a condition variable is signaled.
Definition cond.c:56
void cond_log_state(const cond_t *cond, const char *file, int line, const char *func)
Log the state of a condition variable.
Definition cond.c:153
int cond_wait_impl(cond_t *cond, mutex_t *mutex)
Wait on a condition variable (blocking) - implementation function.
int cond_timedwait_impl(cond_t *cond, mutex_t *mutex, uint64_t timeout_ns)
Wait on a condition variable with timeout - implementation function.
int debug_sync_cond_timedwait(cond_t *cond, mutex_t *mutex, uint64_t timeout_ns, const char *file, int line, const char *func)
Definition sync.c:797
int cond_destroy(cond_t *cond)
Destroy a condition variable.
Cross-platform mutex interface for ascii-chat.
ClangTool/LibTooling compatibility shim for stdbool.h.
Atomic value wrapper for integral/boolean types.
Definition atomic.h:76
Condition variable type (POSIX: pthread_cond_t with debug tracking)
Definition cond.h:63
uint64_t last_wait_time_ns
Timestamp of last wait (nanoseconds)
Definition cond.h:70
mutex_t * last_wait_mutex
Associated mutex at most recent wait (for deadlock detection)
Definition cond.h:72
uint64_t broadcast_count
Total broadcast calls.
Definition cond.h:78
uint64_t last_broadcast_time_ns
Timestamp of last broadcast (nanoseconds)
Definition cond.h:69
uint64_t last_signal_time_ns
Timestamp of last signal (nanoseconds)
Definition cond.h:68
pthread_cond_t impl
Underlying POSIX condition variable.
Definition cond.h:64
uintptr_t last_waiting_key
Registry key of most recent waiter.
Definition cond.h:71
atomic_t waiting_count
Number of threads currently waiting (functional - needed for all builds)
Definition cond.h:66
const char * last_wait_file
Callsite file of most recent cond_wait (for deadlock detection)
Definition cond.h:73
uint64_t signal_count
Total signal calls.
Definition cond.h:77
const char * name
Human-readable name for named registry (all builds)
Definition cond.h:65
uint64_t wait_count
Total wait calls.
Definition cond.h:76
int last_wait_line
Callsite line of most recent cond_wait (for deadlock detection)
Definition cond.h:74
const char * last_wait_func
Callsite function of most recent cond_wait (for deadlock detection)
Definition cond.h:75
Mutex type (POSIX: pthread_mutex_t with debug tracking)
Wrapper for windows.h with C23 alignment compatibility.