1 // RUN: %clang_tsan %s -o %t -framework Foundation 2 // RUN: %run %t 2>&1 3 4 #import <Foundation/Foundation.h> 5 6 #import "../test.h" 7 8 static const long kNumThreads = 4; 9 10 long global; 11 long global2; 12 13 static dispatch_once_t once_token; 14 static dispatch_once_t once_token2; 15 16 void f(void *) { 17 global2 = 42; 18 usleep(100000); 19 } 20 21 void *Thread(void *a) { 22 barrier_wait(&barrier); 23 24 dispatch_once(&once_token, ^{ 25 global = 42; 26 usleep(100000); 27 }); 28 long x = global; 29 30 dispatch_once_f(&once_token2, NULL, f); 31 long x2 = global2; 32 33 fprintf(stderr, "global = %ld\n", x); 34 fprintf(stderr, "global2 = %ld\n", x2); 35 return 0; 36 } 37 38 int main() { 39 fprintf(stderr, "Hello world.\n"); 40 barrier_init(&barrier, kNumThreads); 41 42 pthread_t t[kNumThreads]; 43 for (int i = 0; i < kNumThreads; i++) { 44 pthread_create(&t[i], 0, Thread, 0); 45 } 46 for (int i = 0; i < kNumThreads; i++) { 47 pthread_join(t[i], 0); 48 } 49 50 fprintf(stderr, "Done.\n"); 51 } 52 53 // CHECK: Hello world. 54 // CHECK: Done. 55 // CHECK-NOT: WARNING: ThreadSanitizer 56