1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Test for ANNOTATE_BENIGN_RACE_STATIC() and ANNOTATE_UNPROTECTED_READ(). 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <pthread.h> /* pthread_create() */ 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h> /* fprintf() */ 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "../../drd/drd.h" 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Local variables. */ 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int s_i; 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic volatile int s_j; 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownANNOTATE_BENIGN_RACE_STATIC(s_i, "Benign because duplicate assignment."); 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Local functions. */ 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic inline void AnnotateIgnoreReadsBegin() { ANNOTATE_IGNORE_READS_BEGIN(); } 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic inline void AnnotateIgnoreReadsEnd() { ANNOTATE_IGNORE_READS_END(); } 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void* thread_func(void*) 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(__powerpc__) && __GNUC__ -0 == 4 && __GNUC_MINOR__ -0 == 3 \ 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown && __GNUC_PATCHLEVEL__ -0 == 0 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown AnnotateIgnoreReadsBegin(); 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int i = s_j; 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown AnnotateIgnoreReadsEnd(); 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown s_i = i; 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown s_i = ANNOTATE_UNPROTECTED_READ(s_j); 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(int argc, char** argv) 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_t tid; 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_create(&tid, 0, thread_func, NULL); 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown s_j++; 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown s_i = s_j; 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_join(tid, NULL); 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "Done.\n"); 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 49