// -*- 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 {
cond.wait(lock, [&] {
return my_id == unblock_id;
});
+ _set_locked_by();
}
bool try_lock()
return false;
}
++next_id;
+ _set_locked_by();
return true;
}
{
std::lock_guard lock(mutex);
++unblock_id;
+ _reset_locked_by();
cond.notify_all();
}
{
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