refactor
This commit is contained in:
		| @@ -26,6 +26,7 @@ | ||||
|  | ||||
| namespace repertory { | ||||
| class app_config; | ||||
|  | ||||
| class polling final { | ||||
| public: | ||||
|   enum struct frequency { | ||||
|   | ||||
| @@ -29,24 +29,29 @@ polling polling::instance_; | ||||
| void polling::frequency_thread( | ||||
|     std::function<std::uint32_t()> get_frequency_seconds, frequency freq) { | ||||
|   while (not stop_requested_) { | ||||
|     std::deque<std::future<void>> 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<polling_item_begin>(item.first); | ||||
|               } | ||||
|               item.second.action(stop_requested_); | ||||
|               if (config_->get_event_level() == event_level::trace || | ||||
|                   freq != frequency::second) { | ||||
|                 event_system::instance().raise<polling_item_end>(item.first); | ||||
|               } | ||||
|             })); | ||||
|       } | ||||
|     } | ||||
|     auto futures = std::accumulate( | ||||
|         items_.begin(), items_.end(), std::deque<std::future<void>>{}, | ||||
|         [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<polling_item_begin>( | ||||
|                       item.first); | ||||
|                 } | ||||
|                 item.second.action(stop_requested_); | ||||
|                 if (config_->get_event_level() == event_level::trace || | ||||
|                     freq != frequency::second) { | ||||
|                   event_system::instance().raise<polling_item_end>(item.first); | ||||
|                 } | ||||
|               })); | ||||
|           return futures; | ||||
|         }); | ||||
|     lock.unlock(); | ||||
|  | ||||
|     while (not futures.empty()) { | ||||
| @@ -111,13 +116,14 @@ void polling::stop() { | ||||
|   event_system::instance().raise<service_shutdown_begin>("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(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user