1/* { dg-shouldfail "tsan" } */ 2/* { dg-additional-options "-ldl" } */ 3 4#include <pthread.h> 5#include <unistd.h> 6#include "tsan_barrier.h" 7 8static pthread_barrier_t barrier; 9int X = 0; 10 11void MySleep() { 12 sleep(1); 13} 14 15void *Thread(void *p) { 16 barrier_wait(&barrier); 17 MySleep(); // Assume the main thread has done the write. 18 X = 42; 19 return 0; 20} 21 22int main() { 23 barrier_init(&barrier, 2); 24 pthread_t t; 25 pthread_create(&t, 0, Thread, 0); 26 X = 43; 27 barrier_wait(&barrier); 28 pthread_join(t, 0); 29 return 0; 30} 31 32/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r).*} */ 33/* { dg-output " As if synchronized via sleep:(\n|\r\n|\r)} */ 34/* { dg-output " #0 sleep.*"*} */ 35/* { dg-output " #1 MySleep.*"*} */ 36/* { dg-output " #2 Thread.*"*} */ 37