5 #include "libinterface.h"
7 #define RW_LOCK_BIAS 0x00100000
8 #define WRITE_LOCK_CMP RW_LOCK_BIAS
10 /** Example implementation of linux rw lock along with 2 thread test
17 static inline void read_lock(MCID _mrw, rwlock_t *rw)
19 MCID _rmw0 = MC2_nextRMW(MCID_NODEP, MCID_NODEP, MCID_NODEP);
20 int priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-1));
26 int _cond0 = priorvalue <= 0;
27 MCID _cond0_m = MC2_function(1, sizeof(_cond0), _cond0, _rmw0);
28 if (_cond0) {_br0 = MC2_branchUsesID(_cond0_m, 1, 2, true);
32 _br0 = MC2_branchUsesID(_cond0_m, 0, 2, true);
36 MCID _rmw1 = MC2_nextRMW(MCID_NODEP, MCID_NODEP, MCID_NODEP);
37 rmw_32(ADD, &rw->lock, /* dummy */ 0, 1);
41 MCID _mstatus; _mstatus=MC2_nextOpLoadOffset(_mrw, MC2_OFFSET(rwlock_t *, lock)); int status = load_32(&rw->lock);
44 int _cond1 = status > 0;
45 MCID _cond1_m = MC2_function(1, sizeof(_cond1), _cond1, _mstatus);
46 if (_cond1) {_br1 = MC2_branchUsesID(_cond1_m, 1, 2, true);
50 _br1 = MC2_branchUsesID(_cond1_m, 0, 2, true);
58 MCID _rmw2 = MC2_nextRMW(MCID_NODEP, MCID_NODEP, MCID_NODEP);
59 priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-1));
66 static inline void write_lock(MCID _mrw, rwlock_t *rw)
68 MCID _rmw3 = MC2_nextRMW(MCID_NODEP, MCID_NODEP, MCID_NODEP);
69 int priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-(RW_LOCK_BIAS)));
75 int _cond2 = priorvalue != 1048576;
76 MCID _cond2_m = MC2_function(1, sizeof(_cond2), _cond2, _rmw3);
77 if (_cond2) {_br2 = MC2_branchUsesID(_cond2_m, 1, 2, true);
81 _br2 = MC2_branchUsesID(_cond2_m, 0, 2, true);
85 MCID _rmw4 = MC2_nextRMW(MCID_NODEP, MCID_NODEP, MCID_NODEP);
86 rmw_32(ADD, &rw->lock, /* dummy */ 0, RW_LOCK_BIAS);
90 MCID _mstatus; _mstatus=MC2_nextOpLoadOffset(_mrw, MC2_OFFSET(rwlock_t *, lock)); int status = load_32(&rw->lock);
93 int _cond3 = status != 1048576;
94 MCID _cond3_m = MC2_function(1, sizeof(_cond3), _cond3, _mstatus);
95 if (_cond3) {_br3 = MC2_branchUsesID(_cond3_m, 1, 2, true);
99 _br3 = MC2_branchUsesID(_cond3_m, 0, 2, true);
107 MCID _rmw5 = MC2_nextRMW(MCID_NODEP, MCID_NODEP, MCID_NODEP);
108 priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-(RW_LOCK_BIAS)));
114 static inline bool write_trylock(MCID _mrw, rwlock_t *rw, MCID * retval)
116 MCID _rmw6 = MC2_nextRMW(MCID_NODEP, MCID_NODEP, MCID_NODEP);
117 int priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-(RW_LOCK_BIAS)));
119 MCID _fn0; int flag = priorvalue != RW_LOCK_BIAS;
120 _fn0 = MC2_function(1, sizeof (flag), flag, _rmw6);
122 if (flag) {_br4 = MC2_branchUsesID(_fn0, 1, 2, true);
126 _br4 = MC2_branchUsesID(_fn0, 0, 2, true);
127 MCID _rmw7 = MC2_nextRMW(MCID_NODEP, MCID_NODEP, MCID_NODEP);
128 rmw_32(ADD, &rw->lock, /* dummy */ 0, RW_LOCK_BIAS);
136 static inline void read_unlock(MCID _mrw, rwlock_t *rw)
138 MCID _rmw8 = MC2_nextRMW(MCID_NODEP, MCID_NODEP, MCID_NODEP);
139 rmw_32(ADD, &rw->lock, /* dummy */ 0, 1);
142 static inline void write_unlock(MCID _mrw, rwlock_t *rw)
144 MCID _rmw9 = MC2_nextRMW(MCID_NODEP, MCID_NODEP, MCID_NODEP);
145 rmw_32(ADD, &rw->lock, /* dummy */ 0, RW_LOCK_BIAS);
148 MCID _mmylock; rwlock_t mylock;
153 int flag=write_trylock(MCID_NODEP, &mylock, &_rv0);
156 _br5 = MC2_branchUsesID(_rv0, 1, 2, true);
157 write_unlock(MCID_NODEP, &mylock);
159 } else { _br5 = MC2_branchUsesID(_rv0, 0, 2, true); MC2_merge(_br5);
163 static void a(void *obj)
173 int user_main(int argc, char **argv)
177 MC2_nextOpStoreOffset(_mmylock, MC2_OFFSET(rwlock_t, lock), MCID_NODEP);
178 store_32(&mylock.lock, RW_LOCK_BIAS);
180 thrd_create(&t1, (thrd_start_t)&a, NULL);
181 thrd_create(&t2, (thrd_start_t)&a, NULL);
182 // thrd_create(&t3, (thrd_start_t)&a, NULL);
183 // thrd_create(&t4, (thrd_start_t)&a, NULL);