20#define RWLOCK_DEADLOCK_TIMEOUT (CLOCKS_PER_SEC * 10)
27#define RWLOCK_READ_SCOPE(lock) \
28 __attribute__((cleanup(rwlock_read_cleanup))) rwlock_t* CONCAT(rl, __COUNTER__) = (lock); \
29 rwlock_read_acquire((lock))
36#define RWLOCK_WRITE_SCOPE(lock) \
37 __attribute__((cleanup(rwlock_write_cleanup))) rwlock_t* CONCAT(wl, __COUNTER__) = (lock); \
38 rwlock_write_acquire((lock))
45#define RWLOCK_CREATE \
48 .readTicket = ATOMIC_VAR_INIT(0), .readServe = ATOMIC_VAR_INIT(0), .writeTicket = ATOMIC_VAR_INIT(0), \
49 .writeServe = ATOMIC_VAR_INIT(0), .activeReaders = ATOMIC_VAR_INIT(0), .activeWriter = ATOMIC_VAR_INIT(false) \
void rwlock_write_acquire(rwlock_t *lock)
Acquires a rwlock for writing, blocking until it is available.
static void rwlock_write_cleanup(rwlock_t **lock)
void rwlock_read_acquire(rwlock_t *lock)
Acquires a rwlock for reading, blocking until it is available.
void rwlock_read_release(rwlock_t *lock)
Releases a rwlock from reading.
void rwlock_write_release(rwlock_t *lock)
Releases a rwlock from writing.
static void rwlock_read_cleanup(rwlock_t **lock)
void rwlock_init(rwlock_t *lock)
Initializes a rwlock.
Read-Write Ticket Lock structure.
atomic_uint_fast16_t readTicket
atomic_uint_fast16_t writeServe
atomic_uint_fast16_t readServe
atomic_uint_fast16_t activeReaders
atomic_uint_fast16_t writeTicket
Thread of execution structure.