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