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