/*
 * Test program with happens-before / happens-after annotations that triggers
 * a data race. The data race will only be reported if happens-after
 * annotations that occur in different threads are not totally ordered. Or:
 * this is a test for the implementation of ordering annotations.
 */


#include <stdio.h>
#include <pthread.h>
#include "unified_annotations.h"


static int s_i;


static void* thread_func(void* arg)
{
  int i;

  U_ANNOTATE_HAPPENS_AFTER(&s_i);
  i = s_i;
  U_ANNOTATE_HAPPENS_AFTER(&s_i);
  *(int*)arg = i;
  return NULL;
}

int main(int argc, char** argv)
{
  const struct timespec delay = { 0, 100 * 1000 * 1000 };
  pthread_t tid[2];
  int result[2];

  U_ANNOTATE_HAPPENS_BEFORE(&s_i);
  pthread_create(&tid[0], 0, thread_func, &result[0]);
  pthread_create(&tid[1], 0, thread_func, &result[1]);

  nanosleep(&delay, 0);

  s_i = 1;

  pthread_join(tid[0], NULL);
  pthread_join(tid[1], NULL);

  fprintf(stderr, "Done.\n");

  return 0;
}