Home | History | Annotate | Download | only in Darwin
      1 // Check that calling dispatch_once from a report callback works.
      2 
      3 // RUN: %clang_tsan %s -o %t -framework Foundation
      4 // RUN: %env_tsan_opts=ignore_interceptors_accesses=1 not %run %t 2>&1 | FileCheck %s
      5 
      6 #import <Foundation/Foundation.h>
      7 #import <pthread.h>
      8 
      9 long g = 0;
     10 long h = 0;
     11 void f() {
     12   static dispatch_once_t onceToken;
     13   dispatch_once(&onceToken, ^{
     14     g++;
     15   });
     16   h++;
     17 }
     18 
     19 extern "C" void __tsan_on_report() {
     20   fprintf(stderr, "Report.\n");
     21   f();
     22 }
     23 
     24 int main() {
     25   fprintf(stderr, "Hello world.\n");
     26 
     27   f();
     28 
     29   pthread_mutex_t mutex = {0};
     30   pthread_mutex_lock(&mutex);
     31 
     32   fprintf(stderr, "g = %ld.\n", g);
     33   fprintf(stderr, "h = %ld.\n", h);
     34   fprintf(stderr, "Done.\n");
     35 }
     36 
     37 // CHECK: Hello world.
     38 // CHECK: Report.
     39 // CHECK: g = 1
     40 // CHECK: h = 2
     41 // CHECK: Done.
     42