Browse Source

locking: teach Clang's -Wthread-safety to cope with our scoped lock macros

This allows us to use function/variable/class attributes to specify locking
requisites, allowing problems to be detected during static analysis.

This works perfectly with newer Clang versions (tested with 3.3-3.7). For older
versions (tested 3.2), it compiles fine but spews lots of false-positives.
pull/4/head
Cory Fields 9 years ago
committed by Jack Grigg
parent
commit
5093299af0
No known key found for this signature in database GPG Key ID: 6A6914DAFBEA00DA
  1. 8
      src/sync.h

8
src/sync.h

@ -101,7 +101,7 @@ void PrintLockContention(const char* pszName, const char* pszFile, int nLine);
/** Wrapper around boost::unique_lock<Mutex> */ /** Wrapper around boost::unique_lock<Mutex> */
template <typename Mutex> template <typename Mutex>
class CMutexLock class SCOPED_LOCKABLE CMutexLock
{ {
private: private:
boost::unique_lock<Mutex> lock; boost::unique_lock<Mutex> lock;
@ -129,7 +129,7 @@ private:
} }
public: public:
CMutexLock(Mutex& mutexIn, const char* pszName, const char* pszFile, int nLine, bool fTry = false) : lock(mutexIn, boost::defer_lock) CMutexLock(Mutex& mutexIn, const char* pszName, const char* pszFile, int nLine, bool fTry = false) EXCLUSIVE_LOCK_FUNCTION(mutexIn) : lock(mutexIn, boost::defer_lock)
{ {
if (fTry) if (fTry)
TryEnter(pszName, pszFile, nLine); TryEnter(pszName, pszFile, nLine);
@ -137,7 +137,7 @@ public:
Enter(pszName, pszFile, nLine); Enter(pszName, pszFile, nLine);
} }
CMutexLock(Mutex* pmutexIn, const char* pszName, const char* pszFile, int nLine, bool fTry = false) CMutexLock(Mutex* pmutexIn, const char* pszName, const char* pszFile, int nLine, bool fTry = false) EXCLUSIVE_LOCK_FUNCTION(pmutexIn)
{ {
if (!pmutexIn) return; if (!pmutexIn) return;
@ -148,7 +148,7 @@ public:
Enter(pszName, pszFile, nLine); Enter(pszName, pszFile, nLine);
} }
~CMutexLock() ~CMutexLock() UNLOCK_FUNCTION()
{ {
if (lock.owns_lock()) if (lock.owns_lock())
LeaveCritical(); LeaveCritical();

Loading…
Cancel
Save