/*
* 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;
}