3 #include "libthreads.h"
8 #define RW_LOCK_BIAS 0x00100000
9 #define WRITE_LOCK_CMP RW_LOCK_BIAS
11 /** Example implementation of linux rw lock along with 2 thread test
19 static inline int read_can_lock(rwlock_t *lock)
21 return atomic_load_explicit(&lock->lock, memory_order_relaxed) > 0;
24 static inline int write_can_lock(rwlock_t *lock)
26 return atomic_load_explicit(&lock->lock, memory_order_relaxed) == RW_LOCK_BIAS;
29 static inline void read_lock(rwlock_t *rw)
31 int currentvalue=atomic_fetch_sub_explicit(&rw->lock, 1, memory_order_acquire);
32 while (currentvalue<0) {
33 atomic_fetch_add_explicit(&rw->lock, 1, memory_order_relaxed);
35 currentvalue=atomic_load_explicit(&rw->lock, memory_order_relaxed);
36 } while(currentvalue<=0);
37 currentvalue=atomic_fetch_sub_explicit(&rw->lock, 1, memory_order_acquire);
41 static inline void write_lock(rwlock_t *rw)
43 int currentvalue=atomic_fetch_sub_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_acquire);
44 while (currentvalue!=0) {
45 atomic_fetch_add_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_relaxed);
47 currentvalue=atomic_load_explicit(&rw->lock, memory_order_relaxed);
48 } while(currentvalue!=RW_LOCK_BIAS);
49 currentvalue=atomic_fetch_sub_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_acquire);
53 static inline int read_trylock(rwlock_t *rw)
55 int currentvalue=atomic_fetch_sub_explicit(&rw->lock, 1, memory_order_acquire);
59 atomic_fetch_add_explicit(&rw->lock, 1, memory_order_relaxed);
63 static inline int write_trylock(rwlock_t *rw)
65 int currentvalue=atomic_fetch_sub_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_acquire);
69 atomic_fetch_add_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_relaxed);
73 static inline void read_unlock(rwlock_t *rw)
75 atomic_fetch_add_explicit(&rw->lock, 1, memory_order_release);
78 static inline void write_unlock(rwlock_t *rw)
80 atomic_fetch_add_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_release);
86 static void a(void *obj)
96 store_32(&shareddata,(unsigned int)i);
97 write_unlock(&mylock);
105 atomic_init(&mylock.lock, RW_LOCK_BIAS);
107 thrd_create(&t1, (thrd_start_t)&a, NULL);
108 thrd_create(&t2, (thrd_start_t)&a, NULL);