1// RUN: %clangxx_tsan %s -o %t -framework Foundation -fobjc-arc
2// RUN: %run %t 2>&1 | FileCheck %s
3
4#import <Foundation/Foundation.h>
5
6@interface MyClass : NSObject {
7 long field;
8}
9@property (nonatomic, readonly) long value;
10@end
11
12dispatch_group_t group;
13
14@implementation MyClass
15
16- (void) start {
17 dispatch_queue_t q = dispatch_queue_create(NULL, NULL);
18 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
19 for (int i = 0; i < 1000; i++) {
20 dispatch_async(q, ^{
21 @synchronized(self) {
22 self->field = i;
23 }
24 });
25 }
26 });
27}
28
29- (long) value {
30 @synchronized(self) {
31 return self->field;
32 }
33}
34
35- (void)dealloc {
36 dispatch_group_leave(group);
37}
38
39@end
40
41int main() {
42 group = dispatch_group_create();
43 @autoreleasepool {
44 for (int j = 0; j < 100; ++j) {
45 dispatch_group_enter(group);
46 MyClass *obj = [[MyClass alloc] init];
47 [obj start];
48 long x = obj.value;
49 (void)x;
50 }
51 }
52 dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
53 NSLog(@"Hello world");
54}
55
56// CHECK: Hello world
57// CHECK-NOT: WARNING: ThreadSanitizer
58

source code of compiler-rt/test/tsan/Darwin/objc-synchronize.mm