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