4 #include "libinterface.h"
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 void read_lock(rwlock_t *rw)
18 int priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-1));
21 if (priorvalue <= 0) {
26 rmw_32(ADD, &rw->lock, /* dummy */ 0, 1);
29 int status = load_32(&rw->lock);
37 priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-1));
42 static inline void write_lock(rwlock_t *rw)
44 int priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-(RW_LOCK_BIAS)));
47 if (priorvalue != RW_LOCK_BIAS) {
52 rmw_32(ADD, &rw->lock, /* dummy */ 0, RW_LOCK_BIAS);
55 int status = load_32(&rw->lock);
56 if (status != RW_LOCK_BIAS) {
63 priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-(RW_LOCK_BIAS)));
67 static inline bool write_trylock(rwlock_t *rw)
69 int priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-(RW_LOCK_BIAS)));
71 int flag = priorvalue != RW_LOCK_BIAS;
74 rmw_32(ADD, &rw->lock, /* dummy */ 0, RW_LOCK_BIAS);
80 static inline void read_unlock(rwlock_t *rw)
82 rmw_32(ADD, &rw->lock, /* dummy */ 0, 1);
85 static inline void write_unlock(rwlock_t *rw)
87 rmw_32(ADD, &rw->lock, /* dummy */ 0, RW_LOCK_BIAS);
94 int flag=write_trylock(&mylock);
96 write_unlock(&mylock);
100 static void a(void *obj)
107 int user_main(int argc, char **argv)
111 store_32(&mylock.lock, RW_LOCK_BIAS);
113 thrd_create(&t1, (thrd_start_t)&a, NULL);
114 thrd_create(&t2, (thrd_start_t)&a, NULL);
115 // thrd_create(&t3, (thrd_start_t)&a, NULL);
116 // thrd_create(&t4, (thrd_start_t)&a, NULL);