Home | History | Annotate | Download | only in Darwin
      1 // RUN: %clangxx_tsan %s -o %t -framework Foundation -std=c++11
      2 // RUN: %run %t 2>&1 | FileCheck %s
      3 
      4 #import <Foundation/Foundation.h>
      5 #import <libkern/OSAtomic.h>
      6 
      7 #include <thread>
      8 
      9 volatile int64_t retainCount = 0;
     10 
     11 long g = 0;
     12 
     13 void dealloc() {
     14   g = 42;
     15 }
     16 
     17 void release() {
     18   if (OSAtomicAdd64Barrier(-1, &retainCount) == 0) {
     19     dealloc();
     20   }
     21 }
     22 
     23 void retain() {
     24   OSAtomicAdd64Barrier(1, &retainCount);
     25 }
     26 
     27 int main(int argc, const char * argv[]) {
     28   fprintf(stderr, "start\n");
     29   retain();
     30   retain();
     31   
     32   std::thread t([]{
     33     release();
     34   });
     35 
     36   g = 47;
     37 
     38   release();
     39   t.join();
     40 
     41   fprintf(stderr, "end, g = %ld\n", g);
     42 
     43   return 0;
     44 }
     45 
     46 // CHECK: start
     47 // CHECK: end, g = 42
     48 // CHECK-NOT: WARNING: ThreadSanitizer
     49