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
14static int s_i;
15
16
17static 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
28int 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