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 long global;
      7 
      8 int main(int argc, const char *argv[]) {
      9   fprintf(stderr, "Hello world.\n");
     10 
     11   dispatch_queue_t q = dispatch_queue_create("my.queue", DISPATCH_QUEUE_SERIAL);
     12   dispatch_semaphore_t sem = dispatch_semaphore_create(0);
     13 
     14   global = 44;
     15   dispatch_data_t data = dispatch_data_create("buffer", 6, q, ^{
     16     fprintf(stderr, "Data destructor.\n");
     17     global++;
     18 
     19     dispatch_semaphore_signal(sem);
     20   });
     21   dispatch_release(data);
     22   data = nil;
     23 
     24   dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
     25 
     26   data = dispatch_data_create("buffer", 6, q, DISPATCH_DATA_DESTRUCTOR_DEFAULT);
     27   dispatch_release(data);
     28   data = nil;
     29 
     30   fprintf(stderr, "Done.\n");
     31 }
     32 
     33 // CHECK: Hello world.
     34 // CHECK: Data destructor.
     35 // CHECK-NOT: WARNING: ThreadSanitizer
     36 // CHECK: Done.
     37