Disable spurious thread-safety analysis warnings
The WaitListEvent::WaitAny method conditionally locks event mutexes.
Clangs static analysis doesn't understand the pattern, and generates
spurious warnings, which trigger errors.
Bug: 435680470
Change-Id: Ia8c00656829cc2b650073ea1ac671583e9342179
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/257415
Commit-Queue: David Neto <dneto@google.com>
Reviewed-by: Loko Kung <lokokung@google.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/dawn/common/Compiler.h b/src/dawn/common/Compiler.h
index d08ba4d..edb2340 100644
--- a/src/dawn/common/Compiler.h
+++ b/src/dawn/common/Compiler.h
@@ -187,4 +187,21 @@
#define DAWN_UNLOCK_FUNCTION
#endif
+// DAWN_NO_THREAD_SAFETY_ANALYSIS
+//
+// Used when a function is too complicated for the thread safety static
+// analysis, and the compiler generates spurious warnings. Use this sparingly.
+// For example, Clang does not know how to analyze conditionally-held locks, and
+// may generate spurious warnings.
+//
+// Place this macro just before the opening brace of the function *definition*.
+// Do not put it at the declaration.
+//
+// https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#no-thread-safety-analysis
+#if DAWN_HAS_ATTRIBUTE(no_thread_safety_analysis)
+#define DAWN_NO_THREAD_SAFETY_ANALYSIS __attribute__((no_thread_safety_analysis))
+#else
+#define DAWN_NO_THREAD_SAFETY_ANALYSIS
+#endif
+
#endif // SRC_DAWN_COMMON_COMPILER_H_
diff --git a/src/dawn/native/WaitListEvent.h b/src/dawn/native/WaitListEvent.h
index 756d68c..a710b4a 100644
--- a/src/dawn/native/WaitListEvent.h
+++ b/src/dawn/native/WaitListEvent.h
@@ -73,7 +73,11 @@
template <typename It>
bool WaitListEvent::WaitAny(It eventAndReadyStateBegin,
It eventAndReadyStateEnd,
- Nanoseconds timeout) {
+ Nanoseconds timeout)
+ // This method conditionally locks a set of events, and then unlocks them.
+ // The thread-safety analysis does not handle conditional locking, so
+ // we turn off the analysis to avoid spurious warnings.
+ DAWN_NO_THREAD_SAFETY_ANALYSIS {
static_assert(std::is_base_of_v<std::random_access_iterator_tag,
typename std::iterator_traits<It>::iterator_category>);
static_assert(std::is_same_v<typename std::iterator_traits<It>::value_type,