6 #define RW_LOCK_BIAS 0x00100000
7 #define WRITE_LOCK_CMP RW_LOCK_BIAS
9 /** Example implementation of linux rw lock along with 2 thread test
16 static inline int read_can_lock(rwlock_t *lock)
18 return atomic_load_explicit(&lock->lock, memory_order_relaxed) > 0;
21 static inline int write_can_lock(rwlock_t *lock)
23 return atomic_load_explicit(&lock->lock, memory_order_relaxed) == RW_LOCK_BIAS;
26 static inline void read_lock(rwlock_t *rw)
28 int priorvalue = atomic_fetch_sub_explicit(&rw->lock, 1, memory_order_acquire);
29 while (priorvalue <= 0) {
30 atomic_fetch_add_explicit(&rw->lock, 1, memory_order_relaxed);
31 while (atomic_load_explicit(&rw->lock, memory_order_relaxed) <= 0) {
34 priorvalue = atomic_fetch_sub_explicit(&rw->lock, 1, memory_order_acquire);
38 static inline void write_lock(rwlock_t *rw)
40 int priorvalue = atomic_fetch_sub_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_acquire);
41 while (priorvalue != RW_LOCK_BIAS) {
42 atomic_fetch_add_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_relaxed);
43 while (atomic_load_explicit(&rw->lock, memory_order_relaxed) != RW_LOCK_BIAS) {
46 priorvalue = atomic_fetch_sub_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_acquire);
50 static inline int read_trylock(rwlock_t *rw)
52 int priorvalue = atomic_fetch_sub_explicit(&rw->lock, 1, memory_order_acquire);
56 atomic_fetch_add_explicit(&rw->lock, 1, memory_order_relaxed);
60 static inline int write_trylock(rwlock_t *rw)
62 int priorvalue = atomic_fetch_sub_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_acquire);
63 if (priorvalue == RW_LOCK_BIAS)
66 atomic_fetch_add_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_relaxed);
70 static inline void read_unlock(rwlock_t *rw)
72 atomic_fetch_add_explicit(&rw->lock, 1, memory_order_release);
75 static inline void write_unlock(rwlock_t *rw)
77 atomic_fetch_add_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_release);