From d0a8f9df580ecf19749e6d99dd0b3c29721586c4 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Tue, 3 Dec 2024 10:03:42 -0600 Subject: [PATCH] refactor --- .../librepertory/include/utils/polling.hpp | 1 + repertory/librepertory/src/utils/polling.cpp | 44 +++++++++++-------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/repertory/librepertory/include/utils/polling.hpp b/repertory/librepertory/include/utils/polling.hpp index a14b970c..5cce7133 100644 --- a/repertory/librepertory/include/utils/polling.hpp +++ b/repertory/librepertory/include/utils/polling.hpp @@ -26,6 +26,7 @@ namespace repertory { class app_config; + class polling final { public: enum struct frequency { diff --git a/repertory/librepertory/src/utils/polling.cpp b/repertory/librepertory/src/utils/polling.cpp index 2f7681f2..49386d32 100644 --- a/repertory/librepertory/src/utils/polling.cpp +++ b/repertory/librepertory/src/utils/polling.cpp @@ -29,24 +29,29 @@ polling polling::instance_; void polling::frequency_thread( std::function get_frequency_seconds, frequency freq) { while (not stop_requested_) { - std::deque> futures; unique_mutex_lock lock(mutex_); - for (const auto &item : items_) { - if (item.second.freq == freq) { - futures.emplace_back( - std::async(std::launch::async, [this, &freq, item]() -> void { - if (config_->get_event_level() == event_level::trace || - freq != frequency::second) { - event_system::instance().raise(item.first); - } - item.second.action(stop_requested_); - if (config_->get_event_level() == event_level::trace || - freq != frequency::second) { - event_system::instance().raise(item.first); - } - })); - } - } + auto futures = std::accumulate( + items_.begin(), items_.end(), std::deque>{}, + [this, &freq](auto &&futures, auto &&item) { + if (item.second.freq != freq) { + return futures; + } + + futures.emplace_back( + std::async(std::launch::async, [this, &freq, item]() -> void { + if (config_->get_event_level() == event_level::trace || + freq != frequency::second) { + event_system::instance().raise( + item.first); + } + item.second.action(stop_requested_); + if (config_->get_event_level() == event_level::trace || + freq != frequency::second) { + event_system::instance().raise(item.first); + } + })); + return futures; + }); lock.unlock(); while (not futures.empty()) { @@ -111,13 +116,14 @@ void polling::stop() { event_system::instance().raise("polling"); stop_requested_ = true; - unique_mutex_lock lock2(mutex_); + unique_mutex_lock thread_lock(mutex_); notify_.notify_all(); - lock2.unlock(); + thread_lock.unlock(); high_frequency_thread_->join(); low_frequency_thread_->join(); second_frequency_thread_->join(); + high_frequency_thread_.reset(); low_frequency_thread_.reset(); second_frequency_thread_.reset();