wip simpler locking q

pr-642
jackun 2 years ago
parent 9aa7125999
commit ae309aa215
No known key found for this signature in database
GPG Key ID: 119DB3F1D05A9ED3

@ -46,14 +46,13 @@ static void apply_params(overlay_params& params, const overlay_params& old_param
overlay_params_mutexed g_overlay_params; overlay_params_mutexed g_overlay_params;
void overlay_params_mutexed::assign(overlay_params& r) void overlay_params_mutexed::assign(overlay_params& r)
{ {
std::unique_lock<std::mutex> lk(m); std::unique_lock<std::mutex> lk(writer_mutex);
++waiting_writers; writer_cv.wait(lk, [&](){ return readers == 0 && writers == 0; });
writer_cv.wait(lk, [&](){ return active_readers == 0 && active_writers == 0; }); ++writers;
++active_writers;
apply_params(r, instance); apply_params(r, instance);
instance = r; instance = r;
--waiting_writers; SPDLOG_DEBUG("{}", __func__);
--active_writers; --writers;
reader_cv.notify_all(); reader_cv.notify_all();
} }

@ -295,10 +295,10 @@ private:
class overlay_params_mutexed { class overlay_params_mutexed {
overlay_params instance; overlay_params instance;
std::mutex m; std::mutex writer_mutex;
std::condition_variable reader_cv; std::condition_variable reader_cv;
std::condition_variable writer_cv; std::condition_variable writer_cv;
std::atomic_size_t waiting_writers, active_readers, active_writers; std::atomic_size_t writers, readers;
public: public:
overlay_params_mutexed() = default; overlay_params_mutexed() = default;
overlay_params_mutexed(const overlay_params_mutexed&) = delete; overlay_params_mutexed(const overlay_params_mutexed&) = delete;
@ -327,14 +327,25 @@ public:
overlay_params_wrapper get() overlay_params_wrapper get()
{ {
std::unique_lock<std::mutex> lk(m); do
// 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; }); if (writers > 0)
++active_readers; {
std::unique_lock<std::mutex> 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 { return {
instance, instance,
[&]() -> void { [&]() -> void {
--active_readers; --readers;
writer_cv.notify_all(); writer_cv.notify_all();
} }
}; };

Loading…
Cancel
Save