1*7c3d14c8STreehugger Robot // RUN: %clang_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s 2*7c3d14c8STreehugger Robot 3*7c3d14c8STreehugger Robot // pthread barriers are not available on OS X 4*7c3d14c8STreehugger Robot // UNSUPPORTED: darwin 5*7c3d14c8STreehugger Robot 6*7c3d14c8STreehugger Robot #include <pthread.h> 7*7c3d14c8STreehugger Robot #include <stdio.h> 8*7c3d14c8STreehugger Robot #include <stddef.h> 9*7c3d14c8STreehugger Robot #include <unistd.h> 10*7c3d14c8STreehugger Robot 11*7c3d14c8STreehugger Robot pthread_barrier_t B; 12*7c3d14c8STreehugger Robot int Global; 13*7c3d14c8STreehugger Robot Thread1(void * x)14*7c3d14c8STreehugger Robotvoid *Thread1(void *x) { 15*7c3d14c8STreehugger Robot if (pthread_barrier_wait(&B) == PTHREAD_BARRIER_SERIAL_THREAD) 16*7c3d14c8STreehugger Robot pthread_barrier_destroy(&B); 17*7c3d14c8STreehugger Robot return NULL; 18*7c3d14c8STreehugger Robot } 19*7c3d14c8STreehugger Robot Thread2(void * x)20*7c3d14c8STreehugger Robotvoid *Thread2(void *x) { 21*7c3d14c8STreehugger Robot if (pthread_barrier_wait(&B) == PTHREAD_BARRIER_SERIAL_THREAD) 22*7c3d14c8STreehugger Robot pthread_barrier_destroy(&B); 23*7c3d14c8STreehugger Robot return NULL; 24*7c3d14c8STreehugger Robot } 25*7c3d14c8STreehugger Robot main()26*7c3d14c8STreehugger Robotint main() { 27*7c3d14c8STreehugger Robot pthread_barrier_init(&B, 0, 2); 28*7c3d14c8STreehugger Robot pthread_t t; 29*7c3d14c8STreehugger Robot pthread_create(&t, NULL, Thread1, NULL); 30*7c3d14c8STreehugger Robot Thread2(0); 31*7c3d14c8STreehugger Robot pthread_join(t, NULL); 32*7c3d14c8STreehugger Robot return 0; 33*7c3d14c8STreehugger Robot } 34*7c3d14c8STreehugger Robot 35*7c3d14c8STreehugger Robot // CHECK: WARNING: ThreadSanitizer: data race 36