]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common/RWLock: add explicit unlock() to *Lockers
authorYehuda Sadeh <yehuda@inktank.com>
Sat, 3 May 2014 15:33:22 +0000 (08:33 -0700)
committerJohn Spray <john.spray@redhat.com>
Mon, 25 Aug 2014 00:33:39 +0000 (01:33 +0100)
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/common/RWLock.h

index eb2faaaf7c0bdd8fce79a7ed29b4377e2da35864..6f3ffe315b6d66001d004a1bbacd7c334db6962e 100644 (file)
@@ -114,24 +114,46 @@ public:
   class RLocker {
     const RWLock &m_lock;
 
+    bool locked;
+
   public:
     RLocker(const RWLock& lock) : m_lock(lock) {
       m_lock.get_read();
+      locked = true;
+    }
+    void unlock() {
+      assert(locked);
+      m_lock.unlock();
+      locked = false;
     }
     ~RLocker() {
-      m_lock.put_read();
+      if (locked) {
+        m_lock.unlock();
+      }
     }
   };
 
   class WLocker {
     RWLock &m_lock;
 
+    bool locked;
+
   public:
     WLocker(RWLock& lock) : m_lock(lock) {
       m_lock.get_write();
+      locked = true;
+    }
+    void unlock() {
+      assert(locked);
+      m_lock.unlock();
+      locked = false;
     }
     ~WLocker() {
-      m_lock.put_write();
+      if (locked) {
+        m_lock.unlock();
+      }
+    }
+  };
     }
   };
 };