]>
Commit | Line | Data |
---|---|---|
92a42be0 SL |
1 | // RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s |
2 | #include "test.h" | |
1a4d82fc JJ |
3 | |
4 | int Global; | |
5 | pthread_mutex_t mtx; | |
6 | ||
7 | void *Thread1(void *x) { | |
8 | pthread_mutex_lock(&mtx); | |
9 | Global++; | |
10 | pthread_mutex_unlock(&mtx); | |
92a42be0 | 11 | barrier_wait(&barrier); |
1a4d82fc JJ |
12 | return NULL; |
13 | } | |
14 | ||
15 | void *Thread2(void *x) { | |
92a42be0 | 16 | barrier_wait(&barrier); |
1a4d82fc JJ |
17 | Global--; |
18 | return NULL; | |
19 | } | |
20 | ||
21 | int main() { | |
92a42be0 | 22 | barrier_init(&barrier, 2); |
1a4d82fc JJ |
23 | // CHECK: WARNING: ThreadSanitizer: data race |
24 | // CHECK: Write of size 4 at {{.*}} by thread T2: | |
25 | // CHECK: Previous write of size 4 at {{.*}} by thread T1 | |
26 | // CHECK: (mutexes: write [[M1:M[0-9]+]]): | |
27 | // CHECK: Mutex [[M1]] (0x{{.*}}) created at: | |
28 | // CHECK: #0 pthread_mutex_init | |
29 | // CHECK: #1 main {{.*}}/mutexset2.cc:[[@LINE+1]] | |
30 | pthread_mutex_init(&mtx, 0); | |
31 | pthread_t t[2]; | |
32 | pthread_create(&t[0], NULL, Thread1, NULL); | |
33 | pthread_create(&t[1], NULL, Thread2, NULL); | |
34 | pthread_join(t[0], NULL); | |
35 | pthread_join(t[1], NULL); | |
36 | pthread_mutex_destroy(&mtx); | |
37 | } |