]>
Commit | Line | Data |
---|---|---|
3157f602 | 1 | // RUN: %clang_tsan %s -o %t -framework Foundation |
5bcae85e | 2 | // RUN: %deflake %run %t 2>&1 | FileCheck %s |
3157f602 XL |
3 | |
4 | #import <Foundation/Foundation.h> | |
5 | ||
6 | #import "../test.h" | |
7 | ||
8 | @interface MyClass : NSObject { | |
9 | long instance_variable; | |
10 | } | |
11 | - (void)method:(long)value; | |
12 | @end | |
13 | ||
14 | @implementation MyClass | |
15 | ||
16 | - (void)method:(long)value { | |
17 | self->instance_variable = value; | |
18 | } | |
19 | ||
20 | @end | |
21 | ||
22 | int main() { | |
23 | NSLog(@"Hello world."); | |
24 | barrier_init(&barrier, 2); | |
25 | ||
26 | MyClass *my_object = [MyClass new]; | |
27 | [my_object method:42]; | |
28 | ||
29 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | |
30 | [my_object method:43]; | |
31 | barrier_wait(&barrier); | |
32 | }); | |
33 | ||
34 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | |
35 | barrier_wait(&barrier); | |
36 | [my_object method:44]; | |
37 | ||
38 | dispatch_sync(dispatch_get_main_queue(), ^{ | |
39 | CFRunLoopStop(CFRunLoopGetCurrent()); | |
40 | }); | |
41 | }); | |
42 | ||
43 | CFRunLoopRun(); | |
44 | NSLog(@"Done."); | |
45 | return 0; | |
46 | } | |
47 | ||
48 | // CHECK: Hello world. | |
49 | // CHECK: WARNING: ThreadSanitizer: data race | |
50 | // CHECK: Write of size 8 | |
51 | // CHECK: #0 -[MyClass method:] | |
5bcae85e | 52 | // CHECK: Previous write of size 8 |
3157f602 XL |
53 | // CHECK: #0 -[MyClass method:] |
54 | // CHECK: Location is heap block | |
55 | // CHECK: Done. |