5 #include "libinterface.h"
7 /** Example implementation of linux rw lock along with 2 thread test
14 static inline bool write_trylock(MCID _mrw, rwlock_t *rw, MCID * retval)
16 MCID _rmw0 = MC2_nextRMWOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), MCID_NODEP, MCID_NODEP);
17 int priorvalue=rmw_32(CAS, &rw->lock, 0, 1);
22 static inline void write_unlock(MCID _mrw, rwlock_t *rw)
24 MC2_nextOpStoreOffset(_mrw, MC2_OFFSET(rwlock_t *, lock), MCID_NODEP);
25 store_32(&rw->lock, 0);
28 MCID _fn0; rwlock_t * mylock;
32 int flag=write_trylock(MCID_NODEP, mylock, &_rv0);
36 MCID _cond0_m = MC2_function_id(1, 1, sizeof(_cond0), _cond0, _rv0);
37 if (_cond0) {_br0 = MC2_branchUsesID(_rv0, 1, 2, true);
41 _br0 = MC2_branchUsesID(_rv0, 0, 2, true);
42 write_unlock(MCID_NODEP, mylock);
47 static void a(void *obj)
51 for(i=0;i<PROBLEMSIZE;i++)
57 int user_main(int argc, char **argv)
59 thrd_t t1, t2;//, t3, t4;
60 mylock = (rwlock_t*)malloc(sizeof(rwlock_t));
61 _fn0 = MC2_function_id(0, 0, sizeof (mylock), (uint64_t)mylock);
62 MC2_nextOpStoreOffset(_fn0, MC2_OFFSET(rwlock_t *, lock), MCID_NODEP);
63 store_32(&mylock->lock, 0);
65 thrd_create(&t1, (thrd_start_t)&a, NULL);
66 thrd_create(&t2, (thrd_start_t)&a, NULL);
67 //thrd_create(&t3, (thrd_start_t)&a, NULL);
68 //thrd_create(&t4, (thrd_start_t)&a, NULL);