From 342deb5a64d5e4f49c0bb91d8411ee28f552d0b1 Mon Sep 17 00:00:00 2001 From: Ben Doherty Date: Fri, 12 Nov 2021 09:52:58 -0800 Subject: [PATCH] speed up under ThreadSanitizer (#4842) --- libs/utils/include/utils/Condition.h | 2 +- libs/utils/include/utils/Mutex.h | 2 +- libs/utils/include/utils/SpinLock.h | 4 ++-- libs/utils/include/utils/compiler.h | 22 ++++++++++++---------- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/libs/utils/include/utils/Condition.h b/libs/utils/include/utils/Condition.h index 97c7161dbc..2ed2c07fc6 100644 --- a/libs/utils/include/utils/Condition.h +++ b/libs/utils/include/utils/Condition.h @@ -17,7 +17,7 @@ #ifndef TNT_UTILS_CONDITION_H #define TNT_UTILS_CONDITION_H -#if defined(__linux__) && !defined(__SANITIZE_THREAD__) +#if defined(__linux__) #include #else #include diff --git a/libs/utils/include/utils/Mutex.h b/libs/utils/include/utils/Mutex.h index ac03fd2123..8d12d748e1 100644 --- a/libs/utils/include/utils/Mutex.h +++ b/libs/utils/include/utils/Mutex.h @@ -17,7 +17,7 @@ #ifndef TNT_UTILS_MUTEX_H #define TNT_UTILS_MUTEX_H -#if defined(__linux__) && !defined(__SANITIZE_THREAD__) +#if defined(__linux__) #include #else #include diff --git a/libs/utils/include/utils/SpinLock.h b/libs/utils/include/utils/SpinLock.h index 79e4ec4322..e7ce00afac 100644 --- a/libs/utils/include/utils/SpinLock.h +++ b/libs/utils/include/utils/SpinLock.h @@ -75,8 +75,8 @@ private: }; } // namespace details -#if defined(__SANITIZE_THREAD__) -// Unfortunately TSAN doesn't support homegrown synchronization primitives +#if UTILS_HAS_SANITIZE_THREAD +// Active spins with atomics slow down execution too much under ThreadSanitizer. using SpinLock = Mutex; #elif defined(__ARM_ARCH_7A__) // We've had problems with "wfe" on some ARM-V7 devices, causing spurious SIGILL diff --git a/libs/utils/include/utils/compiler.h b/libs/utils/include/utils/compiler.h index 28e6cf963c..8c3551b1a0 100644 --- a/libs/utils/include/utils/compiler.h +++ b/libs/utils/include/utils/compiler.h @@ -65,19 +65,21 @@ #endif #define UTILS_NO_SANITIZE_THREAD -#if defined(__has_feature) -# if __has_feature(thread_sanitizer) -# undef UTILS_NO_SANITIZE_THREAD -# define UTILS_NO_SANITIZE_THREAD __attribute__((no_sanitize("thread"))) -# endif +#if __has_feature(thread_sanitizer) +#undef UTILS_NO_SANITIZE_THREAD +#define UTILS_NO_SANITIZE_THREAD __attribute__((no_sanitize("thread"))) +#endif + +#define UTILS_HAS_SANITIZE_THREAD 0 +#if __has_feature(thread_sanitizer) || defined(__SANITIZE_THREAD__) +#undef UTILS_HAS_SANITIZE_THREAD +#define UTILS_HAS_SANITIZE_THREAD 1 #endif #define UTILS_HAS_SANITIZE_MEMORY 0 -#if defined(__has_feature) -# if __has_feature(memory_sanitizer) -# undef UTILS_HAS_SANITIZE_MEMORY -# define UTILS_HAS_SANITIZE_MEMORY 1 -# endif +#if __has_feature(memory_sanitizer) +#undef UTILS_HAS_SANITIZE_MEMORY +#define UTILS_HAS_SANITIZE_MEMORY 1 #endif /*