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