From 98ace572a1d047157f26f8ed40d4d848502bb973 Mon Sep 17 00:00:00 2001 From: Xiubo Li Date: Mon, 2 Aug 2021 11:52:57 +0800 Subject: [PATCH] common/fair_mutex: add is_locked_by_me support Signed-off-by: Xiubo Li Signed-off-by: Kefu Chai --- src/common/fair_mutex.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/common/fair_mutex.h b/src/common/fair_mutex.h index 17785053dd3d2..9baa044004893 100644 --- a/src/common/fair_mutex.h +++ b/src/common/fair_mutex.h @@ -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 #include 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 -- 2.39.5