1 // RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s 2 #include "test.h" 3 4 int fds[2]; 5 6 void *ThreadCreatePipe(void *x) { 7 pipe(fds); 8 return NULL; 9 } 10 11 void *ThreadDummy(void *x) { 12 return NULL; 13 } 14 15 void *ThreadWrite(void *x) { 16 write(fds[1], "a", 1); 17 barrier_wait(&barrier); 18 return NULL; 19 } 20 21 void *ThreadClose(void *x) { 22 barrier_wait(&barrier); 23 close(fds[0]); 24 close(fds[1]); 25 return NULL; 26 } 27 28 int main() { 29 barrier_init(&barrier, 2); 30 pthread_t t_create; 31 pthread_create(&t_create, NULL, ThreadCreatePipe, NULL); 32 pthread_join(t_create, NULL); 33 34 for (int i = 0; i < 100; i++) { 35 pthread_t t_dummy; 36 pthread_create(&t_dummy, NULL, ThreadDummy, NULL); 37 pthread_join(t_dummy, NULL); 38 } 39 40 pthread_t t[2]; 41 pthread_create(&t[0], NULL, ThreadWrite, NULL); 42 pthread_create(&t[1], NULL, ThreadClose, NULL); 43 pthread_join(t[0], NULL); 44 pthread_join(t[1], NULL); 45 } 46 47 // CHECK-NOT: CHECK failed 48 // CHECK: WARNING: ThreadSanitizer: data race 49 // CHECK: Write of size 8 50 // CHECK: #0 close 51 // CHECK: #1 ThreadClose 52 // CHECK: Previous read of size 8 53 // CHECK: #0 write 54 // CHECK: #1 ThreadWrite 55