[compiler-rt] 5697841 - tsan: add another test for atomics

Dmitry Vyukov via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 29 07:43:29 PDT 2021


Author: Dmitry Vyukov
Date: 2021-07-29T16:43:24+02:00
New Revision: 5697841f66cee81ef58a0d7cb22e5820206c24c6

URL: https://github.com/llvm/llvm-project/commit/5697841f66cee81ef58a0d7cb22e5820206c24c6
DIFF: https://github.com/llvm/llvm-project/commit/5697841f66cee81ef58a0d7cb22e5820206c24c6.diff

LOG: tsan: add another test for atomics

Add a test where atomic-release happens while
another thread spins calling load-acquire.
This can expose some interesting interleavings
of release and acquire.

Reviewed By: melver

Differential Revision: https://reviews.llvm.org/D107055

Added: 
    compiler-rt/test/tsan/atomic_norace2.cpp

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/compiler-rt/test/tsan/atomic_norace2.cpp b/compiler-rt/test/tsan/atomic_norace2.cpp
new file mode 100644
index 000000000000..9f93a558ca85
--- /dev/null
+++ b/compiler-rt/test/tsan/atomic_norace2.cpp
@@ -0,0 +1,48 @@
+// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
+#include "test.h"
+
+const int kTestCount = 3;
+typedef long long T;
+T data[kTestCount];
+T atomics[kTestCount];
+
+void *Thread(void *p) {
+  for (int i = 0; i < kTestCount; i++) {
+    barrier_wait(&barrier);
+    while (__atomic_load_n(&atomics[i], __ATOMIC_ACQUIRE) == 0) {
+    }
+    data[i]++;
+  }
+  return 0;
+}
+
+int main() {
+  barrier_init(&barrier, 2);
+  pthread_t t;
+  pthread_create(&t, 0, Thread, 0);
+  for (int i = 0; i < kTestCount; i++) {
+    barrier_wait(&barrier);
+    // We want the release to happen while the other thread
+    // spins calling load-acquire. This can expose some
+    // interesting interleavings of release and acquire.
+    usleep(100 * 1000);
+    data[i] = 1;
+    switch (i) {
+    case 0:
+      __atomic_store_n(&atomics[i], 1, __ATOMIC_RELEASE);
+      break;
+    case 1:
+      __atomic_fetch_add(&atomics[1], 1, __ATOMIC_RELEASE);
+      break;
+    case 2:
+      T cmp = 0;
+      __atomic_compare_exchange_n(&atomics[2], &cmp, 1, false, __ATOMIC_RELEASE, __ATOMIC_RELAXED);
+      break;
+    }
+  }
+  pthread_join(t, 0);
+  fprintf(stderr, "DONE\n");
+}
+
+// CHECK-NOT: ThreadSanitizer: data race
+// CHECK: DONE


        


More information about the llvm-commits mailing list