Increase size of bootstrap bytes as some Linux distributions need more space.
[satcheck.git] / test / linuxlock.c
1 #include <stdio.h>
2 #include <threads.h>
3 #include <stdatomic.h>
4
5 #include "libinterface.h"
6
7
8 /** Example implementation of linux rw lock along with 2 thread test
9  *  driver... */
10
11 typedef union {
12         int lock;
13 } rwlock_t;
14
15 static inline bool write_trylock(rwlock_t *rw, MCID *retval)
16 {
17         MCID m_priorval=MC2_nextRMW(MCID_NODEP, MCID_NODEP, MCID_NODEP);
18         int priorvalue=rmw_32(CAS, &rw->lock, 0, 1);
19         *retval=m_priorval;
20         return priorvalue;
21 }
22
23 static inline void write_unlock(rwlock_t *rw)
24 {
25         MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
26         store_32(&rw->lock, 0);
27 }
28
29 rwlock_t mylock;
30
31 static void foo() {
32         MCID val;
33         bool flag=write_trylock(&mylock,&val);
34         MCID br;
35         if (flag) {
36                 br=MC2_branchUsesID(val, 1, 2, true);
37                 MC2_merge(br);
38         } else {
39                 br=MC2_branchUsesID(val, 0, 2, true);
40                 write_unlock(&mylock);
41                 MC2_merge(br);
42         }
43 }
44
45 static void a(void *obj)
46 {
47         int i;
48         for(i=0;i<2;i++)
49                 foo();
50 }
51
52 int user_main(int argc, char **argv)
53 {
54         thrd_t t1, t2;//, t3, t4;
55         MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
56         store_32(&mylock.lock, 0);
57
58         thrd_create(&t1, (thrd_start_t)&a, NULL);
59         thrd_create(&t2, (thrd_start_t)&a, NULL);
60         //thrd_create(&t3, (thrd_start_t)&a, NULL);
61         //thrd_create(&t4, (thrd_start_t)&a, NULL);
62
63         thrd_join(t1);
64         thrd_join(t2);
65         //thrd_join(t3);
66         //thrd_join(t4);
67
68         return 0;
69 }