1/* Test program for the annotations that suppress write operations. */
2
3#include <assert.h>  /* assert() */
4#include <pthread.h>
5#include <stdint.h>
6#include <stdio.h>   /* EOF */
7#include <unistd.h>  /* getopt() */
8#include "../../drd/drd.h"
9
10static int8_t s_a;
11static int8_t s_b;
12static int8_t s_c;
13
14static void* thread_func(void* arg)
15{
16  /* Read s_a and modify s_b. */
17  s_b = s_a;
18  /* Modify s_c. */
19  s_c = 1;
20
21  return NULL;
22}
23
24int main(int argc, char** argv)
25{
26  const struct timespec delay = { 0, 100 * 1000 * 1000 };
27  int optchar;
28  int ign_rw = 1;
29  pthread_t tid;
30
31  while ((optchar = getopt(argc, argv, "r")) != EOF)
32  {
33    switch (optchar)
34    {
35    case 'r':
36      ign_rw = 0;
37      break;
38    default:
39      assert(0);
40    }
41  }
42
43  pthread_create(&tid, 0, thread_func, 0);
44
45  /* Let the code in the created thread run first. */
46  nanosleep(&delay, 0);
47
48  if (ign_rw)
49    ANNOTATE_IGNORE_WRITES_BEGIN();
50  /* Read s_b and modify s_a. */
51  s_a = s_b;
52  if (ign_rw)
53    ANNOTATE_IGNORE_WRITES_END();
54
55  /*
56   * Insert a delay here in order to make sure the load of s_c happens
57   * after s_c has been modified.
58   */
59  nanosleep(&delay, 0);
60
61  /* Read s_c and modify s_a. */
62  s_a = s_c;
63
64  pthread_join(tid, 0);
65
66  fprintf(stderr, "Finished.\n");
67
68  return 0;
69}
70