1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Test program with happens-before / happens-after annotations that triggers 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * a data race. The data race will only be reported if happens-after 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * annotations that occur in different threads are not totally ordered. Or: 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * this is a test for the implementation of ordering annotations. 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h> 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <pthread.h> 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "unified_annotations.h" 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int s_i; 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void* thread_func(void* arg) 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int i; 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown U_ANNOTATE_HAPPENS_AFTER(&s_i); 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i = s_i; 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown U_ANNOTATE_HAPPENS_AFTER(&s_i); 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *(int*)arg = i; 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return NULL; 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(int argc, char** argv) 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov const struct timespec delay = { 0, 100 * 1000 * 1000 }; 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_t tid[2]; 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int result[2]; 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown U_ANNOTATE_HAPPENS_BEFORE(&s_i); 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_create(&tid[0], 0, thread_func, &result[0]); 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_create(&tid[1], 0, thread_func, &result[1]); 37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov nanosleep(&delay, 0); 39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown s_i = 1; 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_join(tid[0], NULL); 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_join(tid[1], NULL); 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "Done.\n"); 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 49