diff options
author | Josh Durgin <josh.durgin@inktank.com> | 2013-02-21 11:15:41 -0800 |
---|---|---|
committer | Josh Durgin <josh.durgin@inktank.com> | 2013-02-21 11:15:43 -0800 |
commit | e0f8e5a80d6d22bd4dee79a4996ea7265d11b0c1 (patch) | |
tree | e8f55163f18762973c6dff1e17b76cb13c4ac055 | |
parent | 94e5deebc64ad6b10eaee1ecc1d3ac6263fc5efd (diff) | |
download | ceph-e0f8e5a80d6d22bd4dee79a4996ea7265d11b0c1.tar.gz |
common: add lockers for RWLocks
This makes them easier to use, especially instead of existing mutexes.
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
-rw-r--r-- | src/common/RWLock.h | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/common/RWLock.h b/src/common/RWLock.h index f8915ed288e..6fabc8c3083 100644 --- a/src/common/RWLock.h +++ b/src/common/RWLock.h @@ -48,7 +48,7 @@ public: // read void get_read() { if (g_lockdep) id = lockdep_will_lock(name, id); - pthread_rwlock_rdlock(&L); + pthread_rwlock_rdlock(&L); if (g_lockdep) id = lockdep_locked(name, id); } bool try_get_read() { @@ -78,6 +78,31 @@ public: void put_write() { unlock(); } + +public: + class RLocker { + RWLock &m_lock; + + public: + RLocker(RWLock& lock) : m_lock(lock) { + m_lock.get_read(); + } + ~RLocker() { + m_lock.put_read(); + } + }; + + class WLocker { + RWLock &m_lock; + + public: + WLocker(RWLock& lock) : m_lock(lock) { + m_lock.get_write(); + } + ~WLocker() { + m_lock.put_write(); + } + }; }; #endif // !_Mutex_Posix_ |