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(MCID _mrw, rwlock_t *rw)
18 MCID _rmw0 = MC2_nextRMW(MCID_NODEP, MCID_NODEP, MCID_NODEP);
19 int priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-1));
25 int _cond0 = priorvalue <= 0;
26 MCID _cond0_m = MC2_function(1, sizeof(_cond0), _cond0, _rmw0);
27 if (_cond0) {_br0 = MC2_branchUsesID(_cond0_m, 1, 2, true);
31 _br0 = MC2_branchUsesID(_cond0_m, 0, 2, true);
35 MCID _rmw1 = MC2_nextRMW(MCID_NODEP, MCID_NODEP, MCID_NODEP);
36 rmw_32(ADD, &rw->lock, /* dummy */ 0, 1);
40 MCID _mstatus; _mstatus=MC2_nextOpLoadOffset(_mrw, MC2_OFFSET(rwlock_t *, lock)); int status = load_32(&rw->lock);
43 int _cond1 = status > 0;
44 MCID _cond1_m = MC2_function(1, sizeof(_cond1), _cond1, _mstatus);
45 if (_cond1) {_br1 = MC2_branchUsesID(_cond1_m, 1, 2, true);
49 _br1 = MC2_branchUsesID(_cond1_m, 0, 2, true);
57 MCID _rmw2 = MC2_nextRMW(MCID_NODEP, MCID_NODEP, MCID_NODEP);
58 priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-1));
65 static inline void write_lock(MCID _mrw, rwlock_t *rw)
67 MCID _rmw3 = MC2_nextRMW(MCID_NODEP, MCID_NODEP, MCID_NODEP);
68 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(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_nextRMW(MCID_NODEP, 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(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_nextRMW(MCID_NODEP, 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_nextRMW(MCID_NODEP, 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(1, sizeof (flag), flag, _rmw6);
121 if (flag) {_br4 = MC2_branchUsesID(_fn0, 1, 2, true);
125 _br4 = MC2_branchUsesID(_fn0, 0, 2, true);
126 MCID _rmw7 = MC2_nextRMW(MCID_NODEP, MCID_NODEP, MCID_NODEP);
127 rmw_32(ADD, &rw->lock, /* dummy */ 0, RW_LOCK_BIAS);
135 static inline void read_unlock(MCID _mrw, rwlock_t *rw)
137 MCID _rmw8 = MC2_nextRMW(MCID_NODEP, MCID_NODEP, MCID_NODEP);
138 rmw_32(ADD, &rw->lock, /* dummy */ 0, 1);
141 static inline void write_unlock(MCID _mrw, rwlock_t *rw)
143 MCID _rmw9 = MC2_nextRMW(MCID_NODEP, MCID_NODEP, MCID_NODEP);
144 rmw_32(ADD, &rw->lock, /* dummy */ 0, RW_LOCK_BIAS);
147 MCID _mmylock; rwlock_t mylock;
152 int flag=write_trylock(MCID_NODEP, &mylock, &_rv0);
155 _br5 = MC2_branchUsesID(_rv0, 1, 2, true);
156 write_unlock(MCID_NODEP, &mylock);
158 } else { _br5 = MC2_branchUsesID(_rv0, 0, 2, true); MC2_merge(_br5);
162 static void a(void *obj)
172 int user_main(int argc, char **argv)
176 MC2_nextOpStoreOffset(_mmylock, MC2_OFFSET(rwlock_t, lock), MCID_NODEP);
177 store_32(&mylock.lock, RW_LOCK_BIAS);
179 thrd_create(&t1, (thrd_start_t)&a, NULL);
180 thrd_create(&t2, (thrd_start_t)&a, NULL);
181 // thrd_create(&t3, (thrd_start_t)&a, NULL);
182 // thrd_create(&t4, (thrd_start_t)&a, NULL);