summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Durgin <josh.durgin@inktank.com>2013-02-21 11:15:41 -0800
committerJosh Durgin <josh.durgin@inktank.com>2013-02-21 11:15:43 -0800
commite0f8e5a80d6d22bd4dee79a4996ea7265d11b0c1 (patch)
treee8f55163f18762973c6dff1e17b76cb13c4ac055
parent94e5deebc64ad6b10eaee1ecc1d3ac6263fc5efd (diff)
downloadceph-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.h27
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_