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