Home | History | Annotate | Download | only in Darwin
      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