diff --git a/include/ircd/ctx/mutex.h b/include/ircd/ctx/mutex.h index 7365eb173..1a2a304bb 100644 --- a/include/ircd/ctx/mutex.h +++ b/include/ircd/ctx/mutex.h @@ -26,6 +26,8 @@ class ircd::ctx::mutex dock q; bool m; + void deadlock_assertion() const noexcept; + public: bool locked() const noexcept; size_t waiting() const noexcept; @@ -92,6 +94,8 @@ ircd::ctx::mutex::unlock() inline void ircd::ctx::mutex::lock() { + deadlock_assertion(); + q.wait([this] { return !locked(); @@ -111,6 +115,8 @@ template bool ircd::ctx::mutex::try_lock_until(const time_point &tp) { + deadlock_assertion(); + const bool success { q.wait_until(tp, [this] @@ -129,6 +135,8 @@ inline bool ircd::ctx::mutex::try_lock() noexcept { + deadlock_assertion(); + if(locked()) return false; @@ -156,3 +164,11 @@ const noexcept { return m; } + +inline void +__attribute__((always_inline, artificial)) +ircd::ctx::mutex::deadlock_assertion() +const noexcept +{ + assert(!locked() || !waiting(cur())); +}