annotate compiler-rt/test/tsan/Darwin/objc-synchronize.mm @ 207:2e18cbf3894f

LLVM12
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Jun 2021 06:07:14 +0900
parents 1d019706d866
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1 // RUN: %clangxx_tsan %s -o %t -framework Foundation -fobjc-arc
150
anatofuz
parents:
diff changeset
2 // RUN: %run %t 2>&1 | FileCheck %s
anatofuz
parents:
diff changeset
3
anatofuz
parents:
diff changeset
4 #import <Foundation/Foundation.h>
anatofuz
parents:
diff changeset
5
anatofuz
parents:
diff changeset
6 @interface MyClass : NSObject {
anatofuz
parents:
diff changeset
7 long field;
anatofuz
parents:
diff changeset
8 }
anatofuz
parents:
diff changeset
9 @property (nonatomic, readonly) long value;
anatofuz
parents:
diff changeset
10 @end
anatofuz
parents:
diff changeset
11
anatofuz
parents:
diff changeset
12 dispatch_group_t group;
anatofuz
parents:
diff changeset
13
anatofuz
parents:
diff changeset
14 @implementation MyClass
anatofuz
parents:
diff changeset
15
anatofuz
parents:
diff changeset
16 - (void) start {
anatofuz
parents:
diff changeset
17 dispatch_queue_t q = dispatch_queue_create(NULL, NULL);
anatofuz
parents:
diff changeset
18 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
anatofuz
parents:
diff changeset
19 for (int i = 0; i < 1000; i++) {
anatofuz
parents:
diff changeset
20 dispatch_async(q, ^{
anatofuz
parents:
diff changeset
21 @synchronized(self) {
anatofuz
parents:
diff changeset
22 self->field = i;
anatofuz
parents:
diff changeset
23 }
anatofuz
parents:
diff changeset
24 });
anatofuz
parents:
diff changeset
25 }
anatofuz
parents:
diff changeset
26 });
anatofuz
parents:
diff changeset
27 }
anatofuz
parents:
diff changeset
28
anatofuz
parents:
diff changeset
29 - (long) value {
anatofuz
parents:
diff changeset
30 @synchronized(self) {
anatofuz
parents:
diff changeset
31 return self->field;
anatofuz
parents:
diff changeset
32 }
anatofuz
parents:
diff changeset
33 }
anatofuz
parents:
diff changeset
34
anatofuz
parents:
diff changeset
35 - (void)dealloc {
anatofuz
parents:
diff changeset
36 dispatch_group_leave(group);
anatofuz
parents:
diff changeset
37 }
anatofuz
parents:
diff changeset
38
anatofuz
parents:
diff changeset
39 @end
anatofuz
parents:
diff changeset
40
anatofuz
parents:
diff changeset
41 int main() {
anatofuz
parents:
diff changeset
42 group = dispatch_group_create();
anatofuz
parents:
diff changeset
43 @autoreleasepool {
anatofuz
parents:
diff changeset
44 for (int j = 0; j < 100; ++j) {
anatofuz
parents:
diff changeset
45 dispatch_group_enter(group);
anatofuz
parents:
diff changeset
46 MyClass *obj = [[MyClass alloc] init];
anatofuz
parents:
diff changeset
47 [obj start];
anatofuz
parents:
diff changeset
48 long x = obj.value;
anatofuz
parents:
diff changeset
49 (void)x;
anatofuz
parents:
diff changeset
50 }
anatofuz
parents:
diff changeset
51 }
anatofuz
parents:
diff changeset
52 dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
anatofuz
parents:
diff changeset
53 NSLog(@"Hello world");
anatofuz
parents:
diff changeset
54 }
anatofuz
parents:
diff changeset
55
anatofuz
parents:
diff changeset
56 // CHECK: Hello world
anatofuz
parents:
diff changeset
57 // CHECK-NOT: WARNING: ThreadSanitizer