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