tsan: add a test for flushing memory
authorDmitry Vyukov <dvyukov@google.com>
Fri, 24 Sep 2021 12:54:47 +0000 (14:54 +0200)
committerDmitry Vyukov <dvyukov@google.com>
Fri, 24 Sep 2021 13:59:19 +0000 (15:59 +0200)
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

compiler-rt/include/sanitizer/tsan_interface.h
compiler-rt/test/tsan/flush_memory.cpp [new file with mode: 0644]

index 565aa39..2782e61 100644 (file)
@@ -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 (file)
index 0000000..a68ce0a
--- /dev/null
@@ -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