]>
git.proxmox.com Git - rustc.git/blob - src/libcompiler_builtins/compiler-rt/test/tsan/atomic_race.cc
1 // RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
4 const int kTestCount
= 4;
6 T atomics
[kTestCount
* 2];
8 void Test(int test
, T
*p
, bool main_thread
) {
12 __atomic_fetch_add(p
, 1, __ATOMIC_RELAXED
);
15 } else if (test
== 1) {
17 __atomic_fetch_add(p
, 1, __ATOMIC_RELAXED
);
20 } else if (test
== 2) {
22 sink
= __atomic_load_n(p
, __ATOMIC_SEQ_CST
);
25 } else if (test
== 3) {
27 __atomic_store_n(p
, 1, __ATOMIC_SEQ_CST
);
33 void *Thread(void *p
) {
34 for (int i
= 0; i
< kTestCount
; i
++) {
35 Test(i
, &atomics
[i
], false);
37 barrier_wait(&barrier
);
38 barrier_wait(&barrier
);
39 for (int i
= 0; i
< kTestCount
; i
++) {
40 fprintf(stderr
, "Test %d reverse\n", i
);
41 Test(i
, &atomics
[kTestCount
+ i
], false);
47 barrier_init(&barrier
, 2);
49 pthread_create(&t
, 0, Thread
, 0);
50 barrier_wait(&barrier
);
51 for (int i
= 0; i
< kTestCount
; i
++) {
52 fprintf(stderr
, "Test %d\n", i
);
53 Test(i
, &atomics
[i
], true);
55 for (int i
= 0; i
< kTestCount
; i
++) {
56 Test(i
, &atomics
[kTestCount
+ i
], true);
58 barrier_wait(&barrier
);
63 // CHECK: ThreadSanitizer: data race
64 // CHECK-NOT: SUMMARY{{.*}}tsan_interface_atomic
66 // CHECK: ThreadSanitizer: data race
67 // CHECK-NOT: SUMMARY{{.*}}tsan_interface_atomic
69 // CHECK: ThreadSanitizer: data race
70 // CHECK-NOT: SUMMARY{{.*}}tsan_interface_atomic
72 // CHECK: ThreadSanitizer: data race
73 // CHECK-NOT: SUMMARY{{.*}}tsan_interface_atomic
74 // CHECK: Test 0 reverse
75 // CHECK: ThreadSanitizer: data race
76 // CHECK: Test 1 reverse
77 // CHECK: ThreadSanitizer: data race
78 // CHECK: Test 2 reverse
79 // CHECK: ThreadSanitizer: data race
80 // CHECK: Test 3 reverse
81 // CHECK: ThreadSanitizer: data race