Skip to content

Reader writer lock

include/sync/rwlock.h View source View on GitHub
struct rwlock {
    _Atomic (uintptr_t)  lock_word;
};
enum rwlock_acquire_type {
    RWLOCK_ACQUIRE_READ = 0,
    RWLOCK_ACQUIRE_WRITE = 1,
};
void rwlock_lock(struct rwlock *lock, enum rwlock_acquire_type type);
void rwlock_unlock(struct rwlock *lock);
void rwlock_init(struct rwlock *lock, enum thread_prio_class ceiling);
bool rwlock_held(struct rwlock *lock, enum rwlock_acquire_type type);
void rwlock_read_lock(struct rwlock *lock);
void rwlock_write_lock(struct rwlock *lock);
#define RWLOCK_ASSERT_HELD(lock, type) \
    kassert(rwlock_held((lock), (type)), "rwlock not held")
#define RWLOCK_ASSERT_READ(lock) RWLOCK_ASSERT_HELD((lock), RWLOCK_ACQUIRE_READ)
#define RWLOCK_ASSERT_WRITE(lock) \
    RWLOCK_ASSERT_HELD((lock), RWLOCK_ACQUIRE_WRITE)
#define RWLOCK_PRIO_CEIL_SHIFT (1)
#define RWLOCK_INIT(ceil) {((ceil) << RWLOCK_PRIO_CEIL_SHIFT)}