19360f1a1SJulian Lettner // RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s 2bcaeed49SFangrui Song #include "test.h" 3bcaeed49SFangrui Song 4bcaeed49SFangrui Song int X = 0; 5bcaeed49SFangrui Song MySleep()6*d78782f6SDmitry Vyukov__attribute__((noinline)) void MySleep() { 7bcaeed49SFangrui Song sleep(1); // the sleep that must appear in the report 8bcaeed49SFangrui Song } 9bcaeed49SFangrui Song Thread(void * p)10bcaeed49SFangrui Songvoid *Thread(void *p) { 11bcaeed49SFangrui Song barrier_wait(&barrier); 12bcaeed49SFangrui Song MySleep(); // Assume the main thread has done the write. 13bcaeed49SFangrui Song X = 42; 14bcaeed49SFangrui Song return 0; 15bcaeed49SFangrui Song } 16bcaeed49SFangrui Song main()17bcaeed49SFangrui Songint main() { 18bcaeed49SFangrui Song barrier_init(&barrier, 2); 19bcaeed49SFangrui Song pthread_t t; 20bcaeed49SFangrui Song pthread_create(&t, 0, Thread, 0); 21bcaeed49SFangrui Song X = 43; 22bcaeed49SFangrui Song barrier_wait(&barrier); 23bcaeed49SFangrui Song pthread_join(t, 0); 24bcaeed49SFangrui Song return 0; 25bcaeed49SFangrui Song } 26bcaeed49SFangrui Song 27bcaeed49SFangrui Song // CHECK: WARNING: ThreadSanitizer: data race 28bcaeed49SFangrui Song // ... 29bcaeed49SFangrui Song // CHECK: As if synchronized via sleep: 30bcaeed49SFangrui Song // CHECK-NEXT: #0 sleep 31bcaeed49SFangrui Song // CHECK-NEXT: #1 MySleep 32bcaeed49SFangrui Song // CHECK-NEXT: #2 Thread 33