Increase size of bootstrap bytes as some Linux distributions need more space.
[satcheck.git] / test / userprog.c
1 #include <stdio.h>
2 #include <stdatomic.h>
3 #include "threads.h"
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         MC2_nextOpStore(MCID_NODEP, mr1);
16         store_32(&x, r1);
17
18         MC2_nextOpStore(MCID_NODEP, mr1);
19         store_32(&gr1, r1);
20         printf("r1=%d\n",r1);
21 }
22
23 static void b(void *obj)
24 {
25         MCID mr2=MC2_nextOpLoad(MCID_NODEP);
26         int r2=load_32(&x);
27         MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
28         store_32(&y, 42);
29
30         MC2_nextOpStore(MCID_NODEP, mr2);
31         store_32(&gr2, r2);
32         printf("r2=%d\n",r2);
33 }
34
35 int user_main(int argc, char **argv)
36 {
37         thrd_t t1, t2;
38
39         MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
40         store_32(&x, 0);
41         MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
42         store_32(&y, 0);
43
44         printf("Main thread: creating 2 threads\n");
45         MC2_nextOpThrd_create(MCID_NODEP, MCID_NODEP);
46         thrd_create(&t1, (thrd_start_t)&a, NULL);
47         MC2_nextOpThrd_create(MCID_NODEP, MCID_NODEP);
48         thrd_create(&t2, (thrd_start_t)&b, NULL);
49
50         MC2_nextOpThrd_join(MCID_NODEP);
51         thrd_join(t1);
52         MC2_nextOpThrd_join(MCID_NODEP);
53         thrd_join(t2);
54         printf("Main thread is finished\n");
55         MCID mlgr1=MC2_nextOpLoad(MCID_NODEP);
56         int lgr1=load_32(&gr1);
57
58         MCID mlgr2=MC2_nextOpLoad(MCID_NODEP);
59         int lgr2=load_32(&gr2);
60         printf("lrg1=%d lrg2=%d\n", lgr1, lgr2);
61         MCID br1,br2;
62         if (lgr1==42) {
63                 br1=MC2_branchUsesID(mlgr1, 1, 2, true);
64                 if (lgr2==42) {
65                         br2=MC2_branchUsesID(mlgr2, 1, 2, true);
66                 } else {
67                         br2=MC2_branchUsesID(mlgr2, 0, 2, true);
68                 }
69                 MC2_merge(br2);
70         } else {
71                 br1=MC2_branchUsesID(mlgr1, 0, 2, true);
72         }
73         MC2_merge(br1);
74
75         return 0;
76 }