Remove C/C++11 header files that we don't really use
[satcheck.git] / test / userprog2.c
1 #include <stdio.h>
2 #include <threads.h>
3
4 #include "libinterface.h"
5
6 int x;
7 int y;
8 int gr1;
9 int gr2;
10
11 static void a(void *obj)
12 {
13         MCID mr1=MC2_nextOpLoad(MCID_NODEP);
14         int r1=load_32(&y);
15         MCID br1;
16         if (r1) {
17                 br1=MC2_branchUsesID(mr1, 1, 2, true);
18                 r1=42;
19                 mr1=MC2_function(0, 4, r1);  
20         } else {
21                 br1=MC2_branchUsesID(mr1, 0, 2, true);
22                 r1=0;
23                 mr1=MC2_function(0, 4, r1);  
24         }
25         MC2_merge(br1);
26         mr1=MC2_phi(mr1);
27
28         MC2_nextOpStore(MCID_NODEP, mr1);
29         store_32(&x, r1);
30
31         MC2_nextOpStore(MCID_NODEP, mr1);
32         store_32(&gr1, r1);
33         printf("r1=%d\n",r1);
34 }
35
36 static void b(void *obj)
37 {
38         MCID mr2=MC2_nextOpLoad(MCID_NODEP);
39         int r2=load_32(&x);
40         MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
41         store_32(&y, 42);
42
43         MC2_nextOpStore(MCID_NODEP, mr2);
44         store_32(&gr2, r2);
45         printf("r2=%d\n",r2);
46 }
47
48 int user_main(int argc, char **argv)
49 {
50         thrd_t t1, t2;
51
52         MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
53         store_32(&x, 0);
54         MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
55         store_32(&y, 0);
56
57         printf("Main thread: creating 2 threads\n");
58         MC2_nextOpThrd_create(MCID_NODEP, MCID_NODEP);
59         thrd_create(&t1, (thrd_start_t)&a, NULL);
60         MC2_nextOpThrd_create(MCID_NODEP, MCID_NODEP);
61         thrd_create(&t2, (thrd_start_t)&b, NULL);
62
63         MC2_nextOpThrd_join(MCID_NODEP);
64         thrd_join(t1);
65         MC2_nextOpThrd_join(MCID_NODEP);
66         thrd_join(t2);
67         printf("Main thread is finished\n");
68         MCID mr1=MC2_nextOpLoad(MCID_NODEP);
69         int lgr1=load_32(&gr1);
70
71         MCID mr2=MC2_nextOpLoad(MCID_NODEP);
72         int lgr2=load_32(&gr2);
73         MCID br1,br2;
74         if (lgr1==42) {
75                 br1=MC2_branchUsesID(mr1, 1, 2, true);
76                 if (lgr2==42) {
77                         br2=MC2_branchUsesID(mr2, 1, 2, true);
78                 } else {
79                         br2=MC2_branchUsesID(mr2, 0, 2, true);
80                 }
81                 MC2_merge(br2);
82         } else {
83                 br1=MC2_branchUsesID(mr1, 0, 2, true);
84         }
85         MC2_merge(br1);
86
87         return 0;
88 }