From ae309aa215520afe0954319fb8544584f397492d Mon Sep 17 00:00:00 2001 From: jackun Date: Thu, 23 Jun 2022 23:55:37 +0300 Subject: [PATCH] wip simpler locking q --- src/overlay_params.cpp | 11 +++++------ src/overlay_params.h | 25 ++++++++++++++++++------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/overlay_params.cpp b/src/overlay_params.cpp index e8fe7859..3bd76823 100644 --- a/src/overlay_params.cpp +++ b/src/overlay_params.cpp @@ -46,14 +46,13 @@ static void apply_params(overlay_params& params, const overlay_params& old_param overlay_params_mutexed g_overlay_params; void overlay_params_mutexed::assign(overlay_params& r) { - std::unique_lock lk(m); - ++waiting_writers; - writer_cv.wait(lk, [&](){ return active_readers == 0 && active_writers == 0; }); - ++active_writers; + std::unique_lock lk(writer_mutex); + writer_cv.wait(lk, [&](){ return readers == 0 && writers == 0; }); + ++writers; apply_params(r, instance); instance = r; - --waiting_writers; - --active_writers; + SPDLOG_DEBUG("{}", __func__); + --writers; reader_cv.notify_all(); } diff --git a/src/overlay_params.h b/src/overlay_params.h index 97b91a74..65496644 100644 --- a/src/overlay_params.h +++ b/src/overlay_params.h @@ -295,10 +295,10 @@ private: class overlay_params_mutexed { overlay_params instance; - std::mutex m; + std::mutex writer_mutex; std::condition_variable reader_cv; std::condition_variable writer_cv; - std::atomic_size_t waiting_writers, active_readers, active_writers; + std::atomic_size_t writers, readers; public: overlay_params_mutexed() = default; overlay_params_mutexed(const overlay_params_mutexed&) = delete; @@ -327,14 +327,25 @@ public: overlay_params_wrapper get() { - std::unique_lock lk(m); - // If get() is called again from a sub function, it may block on waiting writers so just continue if active_readers > 0 - reader_cv.wait(lk, [&](){ return waiting_writers == 0 || active_readers > 0; }); - ++active_readers; + do + { + if (writers > 0) + { + std::unique_lock lk(writer_mutex); + // If get() is called again from a sub function, it may block on waiting writers so just continue if active_readers > 0 + reader_cv.wait(lk, [&](){ return writers == 0 || readers > 0; }); + } + + ++readers; + if (writers == 0) + break; + --readers; + } while(true); + return { instance, [&]() -> void { - --active_readers; + --readers; writer_cv.notify_all(); } };