Commit state of repository at time of OOPSLA 2015 submission.
[satcheck.git] / benchmarks / checkfence / linuxrwlock / llock.c.in
1 #include "lsl_protos.h"
2
3
4 #define RW_LOCK_BIAS        TUNELOCK
5
6 /** Example implementation of linux rw lock along with 2 thread test
7  *  driver... */
8
9 typedef struct rwlock {
10         int lock;
11 } rwlock_t;
12
13
14 void lock_init(rwlock_t *lock) {
15   lock->lock=RW_LOCK_BIAS;
16 }
17
18 int add(int * ptr, int val) {
19   return lsl_add_32(ptr, val);
20
21
22 int sub(int * ptr, int val) {
23   return lsl_add_32(ptr, -val);
24
25
26 int write_trylock(rwlock_t *rw) {
27         int priorvalue=sub(&rw->lock, RW_LOCK_BIAS);
28
29         int flag=priorvalue != RW_LOCK_BIAS;
30
31         if (!flag) {
32                 add(&rw->lock, RW_LOCK_BIAS);
33         }
34
35         return flag;
36 }
37
38
39 void write_unlock(rwlock_t *rw) {
40         add(&rw->lock, RW_LOCK_BIAS);
41 }
42
43 void foo(rwlock_t *mylock) {
44         int flag=write_trylock(mylock);
45         if (flag) {
46                 write_unlock(mylock);
47         }
48 }
49
50 void bar(rwlock_t *mylock) {
51         for(int i=0;i<PROBLEMSIZE;i++)
52                 foo(mylock);
53 }