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_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), 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_id(1, 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_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), 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_id(2, 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);
59 MCID _rmw2 = MC2_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), MCID_NODEP, MCID_NODEP);
60 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_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), MCID_NODEP, MCID_NODEP);
69 int priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-(RW_LOCK_BIAS)));
74 int _cond2 = priorvalue != 1048576;
75 MCID _cond2_m = MC2_function_id(3, 1, sizeof(_cond2), _cond2, _rmw3);
76 if (_cond2) {_br2 = MC2_branchUsesID(_cond2_m, 1, 2, true);
80 _br2 = MC2_branchUsesID(_cond2_m, 0, 2, true);
84 MCID _rmw4 = MC2_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), MCID_NODEP, MCID_NODEP);
85 rmw_32(ADD, &rw->lock, /* dummy */ 0, RW_LOCK_BIAS);
89 MCID _mstatus; _mstatus=MC2_nextOpLoadOffset(_mrw, MC2_OFFSET(rwlock_t *, lock)); int status = load_32(&rw->lock);
92 int _cond3 = status != 1048576;
93 MCID _cond3_m = MC2_function_id(4, 1, sizeof(_cond3), _cond3, _mstatus);
94 if (_cond3) {_br3 = MC2_branchUsesID(_cond3_m, 1, 2, true);
98 _br3 = MC2_branchUsesID(_cond3_m, 0, 2, true);
106 MCID _rmw5 = MC2_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), MCID_NODEP, MCID_NODEP);
107 priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-(RW_LOCK_BIAS)));
113 static inline bool write_trylock(MCID _mrw, rwlock_t *rw, MCID * retval)
115 MCID _rmw6 = MC2_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), MCID_NODEP, MCID_NODEP);
116 int priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-(RW_LOCK_BIAS)));
118 MCID _fn0; int flag = priorvalue != RW_LOCK_BIAS;
119 _fn0 = MC2_function_id(7, 1, sizeof (flag), (uint64_t)flag, _rmw6);
123 MCID _cond4_m = MC2_function_id(5, 1, sizeof(_cond4), _cond4, _fn0);
125 _br4 = MC2_branchUsesID(_cond4_m, 1, 2, true);
126 MCID _rmw7 = MC2_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), MCID_NODEP, MCID_NODEP);
127 rmw_32(ADD, &rw->lock, /* dummy */ 0, RW_LOCK_BIAS);
130 else { _br4 = MC2_branchUsesID(_cond4_m, 0, 2, true); MC2_merge(_br4);
136 static inline void read_unlock(MCID _mrw, rwlock_t *rw)
138 MCID _rmw8 = MC2_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), 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_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), MCID_NODEP, MCID_NODEP);
145 rmw_32(ADD, &rw->lock, /* dummy */ 0, RW_LOCK_BIAS);
148 MCID _fn1; rwlock_t * mylock;
153 int res = write_trylock(MCID_NODEP, mylock, &_rv0);
157 MCID _cond5_m = MC2_function_id(6, 1, sizeof(_cond5), _cond5, _rv0);
159 _br5 = MC2_branchUsesID(_rv0, 1, 2, true);
160 write_unlock(MCID_NODEP, mylock);
162 } else {_br5 = MC2_branchUsesID(_rv0, 0, 2, true);
168 static void a(void *obj)
172 for(i=0;i<PROBLEMSIZE;i++)
178 int user_main(int argc, char **argv)
180 mylock = (rwlock_t*)malloc(sizeof(rwlock_t));
182 _fn1 = MC2_function_id(0, 0, sizeof (mylock), (uint64_t)mylock);
185 MC2_nextOpStoreOffset(_fn1, MC2_OFFSET(rwlock_t *, lock), MCID_NODEP);
186 store_32(&mylock->lock, RW_LOCK_BIAS);
188 thrd_create(&t1, (thrd_start_t)&a, NULL);
189 thrd_create(&t2, (thrd_start_t)&a, NULL);
190 // thrd_create(&t3, (thrd_start_t)&a, NULL);
191 // thrd_create(&t4, (thrd_start_t)&a, NULL);