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