Fix thread safety attribute detection failing to link in CMake check (#2178)
The `cmake/thread_safety_attributes.cpp` check was including `../src/mutex.h`, which transitively pulls in `check.h`. That header declares `benchmark::internal::GetAbortHandler()` with `BENCHMARK_EXPORT`, which requires linking against the benchmark library. Since `try_run` in `CXXFeatureCheck.cmake` only links against `BENCHMARK_CXX_LIBRARIES` (which doesn't include the full library at check time), the check failed to link, leaving `HAVE_THREAD_SAFETY_ATTRIBUTES` undefined.
Signed-off-by: anish k <ak8686@princeton.edu>
diff --git a/cmake/thread_safety_attributes.cpp b/cmake/thread_safety_attributes.cpp
index 46161ba..1069a90 100644
--- a/cmake/thread_safety_attributes.cpp
+++ b/cmake/thread_safety_attributes.cpp
@@ -1,4 +1,25 @@
-#define HAVE_THREAD_SAFETY_ATTRIBUTES
-#include "../src/mutex.h"
+#if defined(__clang__)
+#define THREAD_ANNOTATION_ATTRIBUTE_(x) __attribute__((x))
+#else
+#define THREAD_ANNOTATION_ATTRIBUTE_(x)
+#endif
-int main() {}
+#define CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE_(capability(x))
+#define ACQUIRE() THREAD_ANNOTATION_ATTRIBUTE_(acquire_capability())
+#define RELEASE() THREAD_ANNOTATION_ATTRIBUTE_(release_capability())
+
+class CAPABILITY("mutex") Mutex {
+ public:
+ void lock() ACQUIRE();
+ void unlock() RELEASE();
+};
+
+void Mutex::lock() ACQUIRE() {}
+void Mutex::unlock() RELEASE() {}
+
+int main() {
+ Mutex m;
+ m.lock();
+ m.unlock();
+ return 0;
+}