1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Test for ANNOTATE_BENIGN_RACE_STATIC() and ANNOTATE_UNPROTECTED_READ().
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <pthread.h> /* pthread_create() */
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>   /* fprintf() */
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "../../drd/drd.h"
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Local variables. */
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int s_i;
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic volatile int s_j;
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownANNOTATE_BENIGN_RACE_STATIC(s_i, "Benign because duplicate assignment.");
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Local functions. */
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic inline void AnnotateIgnoreReadsBegin() { ANNOTATE_IGNORE_READS_BEGIN(); }
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic inline void AnnotateIgnoreReadsEnd() { ANNOTATE_IGNORE_READS_END(); }
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void* thread_func(void*)
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(__powerpc__) && __GNUC__ -0 == 4 && __GNUC_MINOR__ -0 == 3 \
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    && __GNUC_PATCHLEVEL__ -0 == 0
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  AnnotateIgnoreReadsBegin();
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int i = s_j;
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  AnnotateIgnoreReadsEnd();
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  s_i = i;
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  s_i = ANNOTATE_UNPROTECTED_READ(s_j);
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return 0;
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(int argc, char** argv)
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  pthread_t tid;
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  pthread_create(&tid, 0, thread_func, NULL);
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  s_j++;
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  s_i = s_j;
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  pthread_join(tid, NULL);
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  fprintf(stderr, "Done.\n");
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return 0;
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
49