mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 08:26:14 +00:00
49 lines
973 B
C
49 lines
973 B
C
/*
|
|
* 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;
|
|
}
|