Home | History | Annotate | Download | only in Darwin
      1 // Check that we don't crash when dispatch_main calls pthread_exit which
      2 // quits the main thread.
      3 
      4 // RUN: %clang_tsan %s -o %t -framework Foundation
      5 // RUN: %env_tsan_opts=ignore_interceptors_accesses=1 %run %t 2>&1 | FileCheck %s
      6 
      7 #import <Foundation/Foundation.h>
      8 
      9 int main() {
     10   fprintf(stderr,"Hello world");
     11 
     12   dispatch_queue_t q = dispatch_queue_create("my.queue", DISPATCH_QUEUE_SERIAL);
     13 
     14   dispatch_async(q, ^{
     15     fprintf(stderr,"1");
     16   });
     17 
     18   dispatch_async(q, ^{
     19     fprintf(stderr,"2");
     20   });
     21 
     22   dispatch_async(q, ^{
     23     fprintf(stderr,"3");
     24 
     25     dispatch_async(dispatch_get_main_queue(), ^{
     26       fprintf(stderr,"Done.");
     27       sleep(1);
     28       exit(0);
     29     });
     30   });
     31 
     32   dispatch_main();
     33 }
     34 
     35 // CHECK: Hello world
     36 // CHECK: Done.
     37 // CHECK-NOT: WARNING: ThreadSanitizer
     38 // CHECK-NOT: CHECK failed
     39