1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Test program that triggers several happens-before usage errors. */
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <pthread.h>
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "unified_annotations.h"
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(int argc, char** argv)
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  pthread_mutex_t m;
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  pthread_cond_t  cv;
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int i[64];
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  pthread_mutex_init(&m, NULL);
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  pthread_cond_init(&cv, NULL);
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* happens-after without preceding happens-before. */
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  U_ANNOTATE_HAPPENS_AFTER(&i);
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* happens-after on a mutex. */
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  U_ANNOTATE_HAPPENS_BEFORE(&m);
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* happens-after on a condition variable. */
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  U_ANNOTATE_HAPPENS_BEFORE(&cv);
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* condition variable operation on a h.b. annotated object. */
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  U_ANNOTATE_HAPPENS_BEFORE(&i);
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  pthread_cond_init((pthread_cond_t*)&i, NULL);
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* The sequence below is fine. */
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  U_ANNOTATE_NEW_MEMORY(&i, sizeof(i));
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  U_ANNOTATE_HAPPENS_BEFORE(&i);
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  U_ANNOTATE_HAPPENS_AFTER(&i);
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  U_ANNOTATE_NEW_MEMORY(&i, sizeof(i));
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  U_ANNOTATE_HAPPENS_BEFORE(&i);
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  U_ANNOTATE_NEW_MEMORY(&i, sizeof(i));
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* happens-before after happens-after. */
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  U_ANNOTATE_HAPPENS_BEFORE(&i);
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  U_ANNOTATE_HAPPENS_AFTER(&i);
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  U_ANNOTATE_HAPPENS_BEFORE(&i);
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  fprintf(stderr, "Done.\n");
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return 0;
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Local variables:
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * c-basic-offset: 2
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * End:
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
54