[compiler-rt] ad890aa - tsan: add a test for flushing memory

Dmitry Vyukov via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 24 06:59:23 PDT 2021


Author: Dmitry Vyukov
Date: 2021-09-24T15:59:19+02:00
New Revision: ad890aa2327feb6b6aee676fe85b2352fba2403e

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

LOG: tsan: add a test for flushing memory

Add a test for __tsan_flush_memory() and for background
flushing of the runtime memory.

Reviewed By: melver

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

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

Modified: 
    compiler-rt/include/sanitizer/tsan_interface.h

Removed: 
    


################################################################################
diff  --git a/compiler-rt/include/sanitizer/tsan_interface.h b/compiler-rt/include/sanitizer/tsan_interface.h
index 565aa391a9fac..2782e61fb8c79 100644
--- a/compiler-rt/include/sanitizer/tsan_interface.h
+++ b/compiler-rt/include/sanitizer/tsan_interface.h
@@ -169,6 +169,9 @@ void __tsan_on_initialize();
 // if TSan should exit as if issues were detected.
 int __tsan_on_finalize(int failed);
 
+// Release TSan internal memory in a best-effort manner.
+void __tsan_flush_memory();
+
 #ifdef __cplusplus
 }  // extern "C"
 #endif

diff  --git a/compiler-rt/test/tsan/flush_memory.cpp b/compiler-rt/test/tsan/flush_memory.cpp
new file mode 100644
index 0000000000000..a68ce0ab3b840
--- /dev/null
+++ b/compiler-rt/test/tsan/flush_memory.cpp
@@ -0,0 +1,35 @@
+// RUN: %clangxx_tsan -O1 %s -o %t && %env_tsan_opts="flush_memory_ms=1 flush_symbolizer_ms=1 memory_limit_mb=1" %deflake %t | FileCheck %s
+#include "test.h"
+
+long X, Y;
+
+void *Thread(void *arg) {
+  __atomic_fetch_add(&X, 1, __ATOMIC_SEQ_CST);
+  barrier_wait(&barrier);
+  barrier_wait(&barrier);
+  Y = 1;
+  return &Y;
+}
+
+int main() {
+  __tsan_flush_memory();
+  barrier_init(&barrier, 2);
+  __atomic_fetch_add(&X, 1, __ATOMIC_SEQ_CST);
+  pthread_t t;
+  pthread_create(&t, NULL, Thread, NULL);
+  barrier_wait(&barrier);
+  __tsan_flush_memory();
+  // Trigger a race to test flushing of the symbolizer cache.
+  Y = 2;
+  barrier_wait(&barrier);
+  pthread_join(t, NULL);
+  __atomic_fetch_add(&X, 1, __ATOMIC_SEQ_CST);
+  // Background runtime thread should do some flushes meanwhile.
+  sleep(2);
+  __tsan_flush_memory();
+  fprintf(stderr, "DONE\n");
+  return 0;
+}
+
+// CHECK: WARNING: ThreadSanitizer: data race
+// CHECK: DONE


        


More information about the llvm-commits mailing list