Commit adc40869 authored by Adam Cozzette's avatar Adam Cozzette

Added Clang thread-safety annotations in mutex.h

For Clang's thread safety analysis (-Wthread-safety) to pass without warnings,
we need to annotate WrappedMutex to indicate that Lock() acquires the lock and
Unlock() releases it. This CL adds the annotations and guards them with an
ifdef to make sure they're a no-op on compilers other than Clang.

This is a cherry-pick of a change I already made to the Google-internal
codebase.
parent cf242503
...@@ -34,6 +34,18 @@ ...@@ -34,6 +34,18 @@
#include <google/protobuf/stubs/macros.h> #include <google/protobuf/stubs/macros.h>
// Define thread-safety annotations for use below, if we are building with
// Clang.
#if defined(__clang__) && !defined(SWIG)
#define GOOGLE_PROTOBUF_ACQUIRE(...) \
__attribute__((acquire_capability(__VA_ARGS__)))
#define GOOGLE_PROTOBUF_RELEASE(...) \
__attribute__((release_capability(__VA_ARGS__)))
#else
#define GOOGLE_PROTOBUF_ACQUIRE(...)
#define GOOGLE_PROTOBUF_RELEASE(...)
#endif
// =================================================================== // ===================================================================
// emulates google3/base/mutex.h // emulates google3/base/mutex.h
namespace google { namespace google {
...@@ -48,8 +60,8 @@ namespace internal { ...@@ -48,8 +60,8 @@ namespace internal {
class LIBPROTOBUF_EXPORT WrappedMutex { class LIBPROTOBUF_EXPORT WrappedMutex {
public: public:
WrappedMutex() = default; WrappedMutex() = default;
void Lock() { mu_.lock(); } void Lock() GOOGLE_PROTOBUF_ACQUIRE() { mu_.lock(); }
void Unlock() { mu_.unlock(); } void Unlock() GOOGLE_PROTOBUF_RELEASE() { mu_.unlock(); }
// Crash if this Mutex is not held exclusively by this thread. // Crash if this Mutex is not held exclusively by this thread.
// May fail to crash when it should; will never crash when it should not. // May fail to crash when it should; will never crash when it should not.
void AssertHeld() const {} void AssertHeld() const {}
...@@ -123,8 +135,10 @@ using internal::ReaderMutexLock; ...@@ -123,8 +135,10 @@ using internal::ReaderMutexLock;
using internal::WriterMutexLock; using internal::WriterMutexLock;
using internal::MutexLockMaybe; using internal::MutexLockMaybe;
} // namespace protobuf } // namespace protobuf
} // namespace google } // namespace google
#undef GOOGLE_PROTOBUF_ACQUIRE
#undef GOOGLE_PROTOBUF_RELEASE
#endif // GOOGLE_PROTOBUF_STUBS_MUTEX_H_ #endif // GOOGLE_PROTOBUF_STUBS_MUTEX_H_
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment