1// RUN: %clang_tsan %s -o %t -framework Foundation 2// RUN: %env_tsan_opts=ignore_interceptors_accesses=1 %run %t 2>&1 | FileCheck %s 3 4#import <Foundation/Foundation.h> 5 6#import "../test.h" 7 8static const long kNumThreads = 4; 9 10long global; 11long global2; 12 13static dispatch_once_t once_token; 14static dispatch_once_t once_token2; 15 16void f(void *) { 17 global2 = 42; 18 usleep(100000); 19} 20 21void *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 38int 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