1 /* Test program for the annotations that suppress write operations. */
2
3 #include <assert.h> /* assert() */
4 #include <pthread.h>
5 #include <stdint.h>
6 #include <stdio.h> /* EOF */
7 #include <unistd.h> /* getopt() */
8 #include "../../drd/drd.h"
9
10 static int8_t s_a;
11 static int8_t s_b;
12 static int8_t s_c;
13
thread_func(void * arg)14 static void* thread_func(void* arg)
15 {
16 /* Read s_a and modify s_b. */
17 s_b = s_a;
18 /* Modify s_c. */
19 s_c = 1;
20
21 return NULL;
22 }
23
main(int argc,char ** argv)24 int main(int argc, char** argv)
25 {
26 const struct timespec delay = { 0, 100 * 1000 * 1000 };
27 int optchar;
28 int ign_rw = 1;
29 pthread_t tid;
30
31 while ((optchar = getopt(argc, argv, "r")) != EOF)
32 {
33 switch (optchar)
34 {
35 case 'r':
36 ign_rw = 0;
37 break;
38 default:
39 assert(0);
40 }
41 }
42
43 pthread_create(&tid, 0, thread_func, 0);
44
45 /* Let the code in the created thread run first. */
46 nanosleep(&delay, 0);
47
48 if (ign_rw)
49 ANNOTATE_IGNORE_WRITES_BEGIN();
50 /* Read s_b and modify s_a. */
51 s_a = s_b;
52 if (ign_rw)
53 ANNOTATE_IGNORE_WRITES_END();
54
55 /*
56 * Insert a delay here in order to make sure the load of s_c happens
57 * after s_c has been modified.
58 */
59 nanosleep(&delay, 0);
60
61 /* Read s_c and modify s_a. */
62 s_a = s_c;
63
64 pthread_join(tid, 0);
65
66 fprintf(stderr, "Finished.\n");
67
68 return 0;
69 }
70