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