6 #include "libinterface.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
18 static inline void read_lock(MCID _mrw, rwlock_t *rw)
20 MCID _rmw0 = MC2_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), MCID_NODEP, MCID_NODEP);
21 int priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-1));
27 int _cond0 = priorvalue <= 0;
28 MCID _cond0_m = MC2_function_id(1, 1, sizeof(_cond0), _cond0, _rmw0);
29 if (_cond0) {_br0 = MC2_branchUsesID(_cond0_m, 1, 2, true);
33 _br0 = MC2_branchUsesID(_cond0_m, 0, 2, true);
37 MCID _rmw1 = MC2_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), MCID_NODEP, MCID_NODEP);
38 rmw_32(ADD, &rw->lock, /* dummy */ 0, 1);
42 MCID _mstatus; _mstatus=MC2_nextOpLoadOffset(_mrw, MC2_OFFSET(rwlock_t *, lock)); int status = load_32(&rw->lock);
45 int _cond1 = status > 0;
46 MCID _cond1_m = MC2_function_id(2, 1, sizeof(_cond1), _cond1, _mstatus);
47 if (_cond1) {_br1 = MC2_branchUsesID(_cond1_m, 1, 2, true);
51 _br1 = MC2_branchUsesID(_cond1_m, 0, 2, true);
60 MCID _rmw2 = MC2_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), MCID_NODEP, MCID_NODEP);
61 priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-1));
67 static inline void write_lock(MCID _mrw, rwlock_t *rw)
69 MCID _rmw3 = MC2_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), MCID_NODEP, MCID_NODEP);
70 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_id(3, 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_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), 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_id(4, 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_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), 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_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), 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_id(7, 1, sizeof (flag), (uint64_t)flag, _rmw6);
124 MCID _cond4_m = MC2_function_id(5, 1, sizeof(_cond4), _cond4, _fn0);
126 _br4 = MC2_branchUsesID(_cond4_m, 1, 2, true);
127 MCID _rmw7 = MC2_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), MCID_NODEP, MCID_NODEP);
128 rmw_32(ADD, &rw->lock, /* dummy */ 0, RW_LOCK_BIAS);
131 else { _br4 = MC2_branchUsesID(_cond4_m, 0, 2, true); MC2_merge(_br4);
137 static inline void read_unlock(MCID _mrw, rwlock_t *rw)
139 MCID _rmw8 = MC2_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), MCID_NODEP, MCID_NODEP);
140 rmw_32(ADD, &rw->lock, /* dummy */ 0, 1);
143 static inline void write_unlock(MCID _mrw, rwlock_t *rw)
145 MCID _rmw9 = MC2_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), MCID_NODEP, MCID_NODEP);
146 rmw_32(ADD, &rw->lock, /* dummy */ 0, RW_LOCK_BIAS);
149 MCID _fn1; rwlock_t * mylock;
154 int res = write_trylock(MCID_NODEP, mylock, &_rv0);
158 MCID _cond5_m = MC2_function_id(6, 1, sizeof(_cond5), _cond5, _rv0);
160 _br5 = MC2_branchUsesID(_rv0, 1, 2, true);
161 write_unlock(MCID_NODEP, mylock);
163 } else {_br5 = MC2_branchUsesID(_rv0, 0, 2, true);
169 static void a(void *obj)
173 for(i=0;i<PROBLEMSIZE;i++)
179 int user_main(int argc, char **argv)
181 mylock = (rwlock_t*)malloc(sizeof(rwlock_t));
183 _fn1 = MC2_function_id(0, 0, sizeof (mylock), (uint64_t)mylock);
186 MC2_nextOpStoreOffset(_fn1, MC2_OFFSET(rwlock_t *, lock), MCID_NODEP);
187 store_32(&mylock->lock, RW_LOCK_BIAS);
189 thrd_create(&t1, (thrd_start_t)&a, NULL);
190 thrd_create(&t2, (thrd_start_t)&a, NULL);
191 // thrd_create(&t3, (thrd_start_t)&a, NULL);
192 // thrd_create(&t4, (thrd_start_t)&a, NULL);