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