1 /* Test program for the annotations that suppress both reads and writes. */ 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 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 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 nanosleep(&delay, 0); 46 47 if (ign_rw) 48 ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN(); 49 /* Read s_b and modify s_a. */ 50 s_a = s_b; 51 if (ign_rw) 52 ANNOTATE_IGNORE_READS_AND_WRITES_END(); 53 54 /* 55 * Insert a delay here in order to make sure the load of s_c happens 56 * after s_c has been modified. 57 */ 58 sleep(1); 59 60 /* Read s_c. */ 61 fprintf(stderr, "%s", "x" + s_c); 62 63 pthread_join(tid, 0); 64 65 fprintf(stderr, "Finished.\n"); 66 67 return 0; 68 } 69