207
|
1 // RUN: %clangxx_tsan %s -o %t -framework Foundation -fobjc-arc
|
150
|
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
|
|
12 dispatch_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
|
|
41 int 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
|