Remove C/C++11 header files that we don't really use
[satcheck.git] / clang / test / linuxrwlocks_unannotated.c
1 #include <stdio.h>
2 #include <threads.h>
3
4 #include "libinterface.h"
5
6 #define RW_LOCK_BIAS            0x00100000
7 #define WRITE_LOCK_CMP          RW_LOCK_BIAS
8
9 /** Example implementation of linux rw lock along with 2 thread test
10  *  driver... */
11
12 typedef union {
13         int lock;
14 } rwlock_t;
15
16 static inline void read_lock(rwlock_t *rw)
17 {
18         int priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-1));
19
20         while (true) {
21                 if (priorvalue <= 0) {
22                 } else {
23                         break;
24                 }
25
26                 rmw_32(ADD, &rw->lock, /* dummy */ 0, 1);
27
28                 while (true) {
29                         int status = load_32(&rw->lock);
30                         if (status > 0) {
31                         } else {
32                                 break;
33                         }
34                         MC2_yield();
35                 }
36
37                 priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-1));
38                 MC2_loopIterate();
39         }
40 }
41
42 static inline void write_lock(rwlock_t *rw)
43 {
44         int priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-(RW_LOCK_BIAS)));
45         while(true) {
46
47                 if (priorvalue != RW_LOCK_BIAS) {
48                 } else {
49                         break;
50                 }
51
52                 rmw_32(ADD, &rw->lock, /* dummy */ 0, RW_LOCK_BIAS);
53                 
54                 while (true) {
55                         int status = load_32(&rw->lock);
56                         if (status != RW_LOCK_BIAS) {
57                         } else {
58                                 break;
59                         }
60                         MC2_yield();
61                 }
62
63                 priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-(RW_LOCK_BIAS)));
64         }
65 }
66
67 static inline bool write_trylock(rwlock_t *rw)
68 {
69         int priorvalue=rmw_32(ADD, &rw->lock, /* dummy */ 0, ((unsigned int)-(RW_LOCK_BIAS)));
70
71         int flag = priorvalue != RW_LOCK_BIAS;
72         if (flag) {
73         } else {
74                 rmw_32(ADD, &rw->lock, /* dummy */ 0, RW_LOCK_BIAS);
75         }
76
77         return flag;
78 }
79
80 static inline void read_unlock(rwlock_t *rw)
81 {
82         rmw_32(ADD, &rw->lock, /* dummy */ 0, 1);
83 }
84
85 static inline void write_unlock(rwlock_t *rw)
86 {
87         rmw_32(ADD, &rw->lock, /* dummy */ 0, RW_LOCK_BIAS);
88 }
89
90 rwlock_t mylock;
91 int shareddata;
92
93 static void foo() {
94         int flag=write_trylock(&mylock);
95         if (flag) {
96                 write_unlock(&mylock);
97         }
98 }
99
100 static void a(void *obj)
101 {
102         int i;
103         for(i=0;i<13;i++)
104                 foo();
105 }
106
107 int user_main(int argc, char **argv)
108 {
109         thrd_t t1, t2;
110         //, t3, t4;
111         store_32(&mylock.lock, RW_LOCK_BIAS);
112
113         thrd_create(&t1, (thrd_start_t)&a, NULL);
114         thrd_create(&t2, (thrd_start_t)&a, NULL);
115         //      thrd_create(&t3, (thrd_start_t)&a, NULL);
116         //      thrd_create(&t4, (thrd_start_t)&a, NULL);
117
118         thrd_join(t1);
119         thrd_join(t2);
120         //      thrd_join(t3);
121         //      thrd_join(t4);
122
123         return 0;
124 }