]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common/fair_mutex: add is_locked_by_me support
authorXiubo Li <xiubli@redhat.com>
Mon, 2 Aug 2021 03:52:57 +0000 (11:52 +0800)
committerXiubo Li <xiubli@redhat.com>
Wed, 25 Aug 2021 01:42:33 +0000 (09:42 +0800)
Signed-off-by: Xiubo Li <xiubli@redhat.com>
Signed-off-by: Kefu Chai <kchai@redhat.com>
src/common/fair_mutex.h

index 17785053dd3d2b06cb0ba22576adb8ab7f70314a..9baa0440048932e94eb058b7317b1eae9e53f1c8 100644 (file)
@@ -1,7 +1,10 @@
 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:nil -*-
 
+#pragma once
+
 #include "common/ceph_mutex.h"
 
+#include <thread>
 #include <string>
 
 namespace ceph {
@@ -22,6 +25,7 @@ public:
     cond.wait(lock, [&] {
       return my_id == unblock_id;
     });
+    _set_locked_by();
   }
 
   bool try_lock()
@@ -31,6 +35,7 @@ public:
       return false;
     }
     ++next_id;
+    _set_locked_by();
     return true;
   }
 
@@ -38,6 +43,7 @@ public:
   {
     std::lock_guard lock(mutex);
     ++unblock_id;
+    _reset_locked_by();
     cond.notify_all();
   }
 
@@ -45,10 +51,30 @@ public:
   {
     return next_id != unblock_id;
   }
+
+#ifdef CEPH_DEBUG_MUTEX
+  bool is_locked_by_me() const {
+    return is_locked() && locked_by == std::this_thread::get_id();
+  }
+private:
+  void _set_locked_by() {
+    locked_by = std::this_thread::get_id();
+  }
+  void _reset_locked_by() {
+    locked_by = {};
+  }
+#else
+  void _set_locked_by() {}
+  void _reset_locked_by() {}
+#endif
+
 private:
   unsigned next_id = 0;
   unsigned unblock_id = 0;
   ceph::condition_variable cond;
   ceph::mutex mutex;
+#ifdef CEPH_DEBUG_MUTEX
+  std::thread::id locked_by = {};
+#endif
 };
 } // namespace ceph