From e091cd17a15388ac153da24b65880df522da3f70 Mon Sep 17 00:00:00 2001 From: Guilherme Lawless Date: Wed, 2 Sep 2020 21:44:14 +0100 Subject: [PATCH] Add support for defer_lock in nano::unique_lock (#2909) Needs NANO_TIMED_LOCKS CMake variable > 0 to test, otherwise it defaults to using std::unique_lock This is necessary to build since #2901 but not caught by CI due to not using this developer-oriented feature --- nano/core_test/locks.cpp | 11 +++++++++++ nano/lib/locks.cpp | 6 ++++++ nano/lib/locks.hpp | 1 + 3 files changed, 18 insertions(+) diff --git a/nano/core_test/locks.cpp b/nano/core_test/locks.cpp index f0a8994e..959277e0 100644 --- a/nano/core_test/locks.cpp +++ b/nano/core_test/locks.cpp @@ -178,4 +178,15 @@ TEST (locks, condition_variable_wait_until) // Should be 1 report ASSERT_EQ (num_matches (ss.str ()), 1); } + +TEST (locks, defer_lock) +{ + std::mutex mutex; + nano::unique_lock lock (mutex, std::defer_lock); + ASSERT_FALSE (lock.owns_lock ()); + ASSERT_TRUE (lock.try_lock ()); + ASSERT_TRUE (lock.owns_lock ()); + lock.unlock (); + ASSERT_FALSE (lock.owns_lock ()); +} #endif diff --git a/nano/lib/locks.cpp b/nano/lib/locks.cpp index 931df118..46321f91 100644 --- a/nano/lib/locks.cpp +++ b/nano/lib/locks.cpp @@ -72,6 +72,12 @@ mut (std::addressof (mutex)) lock_impl (); } +template +unique_lock::unique_lock (Mutex & mutex, std::defer_lock_t) noexcept : +mut (std::addressof (mutex)) +{ +} + template void unique_lock::lock_impl () { diff --git a/nano/lib/locks.hpp b/nano/lib/locks.hpp index aaf52932..498a1df3 100644 --- a/nano/lib/locks.hpp +++ b/nano/lib/locks.hpp @@ -56,6 +56,7 @@ class unique_lock final public: unique_lock () = default; explicit unique_lock (Mutex & mutex_a); + unique_lock (Mutex & mutex_a, std::defer_lock_t) noexcept; unique_lock (unique_lock && other) = delete; unique_lock & operator= (unique_lock && other) noexcept; ~unique_lock () noexcept;