Home | History | Annotate | Download | only in Darwin
      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 
      8 long global;
      9 
     10 int main() {
     11   fprintf(stderr, "Hello world.\n");
     12   print_address("addr=", 1, &global);
     13   barrier_init(&barrier, 2);
     14 
     15   dispatch_queue_t q = dispatch_queue_create("my.queue", DISPATCH_QUEUE_CONCURRENT);
     16   dispatch_queue_t bgq = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
     17 
     18   dispatch_async(bgq, ^{
     19     dispatch_sync(q, ^{
     20       global = 42;
     21     });
     22     barrier_wait(&barrier);
     23   });
     24 
     25   dispatch_async(bgq, ^{
     26     barrier_wait(&barrier);
     27     dispatch_barrier_sync(q, ^{
     28       global = 43;
     29     });
     30 
     31     dispatch_async(bgq, ^{
     32       barrier_wait(&barrier);
     33       global = 44;
     34     });
     35 
     36     barrier_wait(&barrier);
     37     
     38     dispatch_sync(dispatch_get_main_queue(), ^{
     39       CFRunLoopStop(CFRunLoopGetCurrent());
     40     });
     41   });
     42 
     43   CFRunLoopRun();
     44   fprintf(stderr, "Done.\n");
     45 }
     46 
     47 // CHECK: Hello world.
     48 // CHECK: Done.
     49 // CHECK-NOT: WARNING: ThreadSanitizer
     50