From d5af87a8e1e99fadd3879a0e2d87bcfbbc87af9a Mon Sep 17 00:00:00 2001 From: gabime Date: Sat, 21 Jul 2018 22:43:36 +0300 Subject: [PATCH] Added periodic flusher support, and fixed some registry issues --- include/spdlog/details/periodic_worker.h | 80 ++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 include/spdlog/details/periodic_worker.h diff --git a/include/spdlog/details/periodic_worker.h b/include/spdlog/details/periodic_worker.h new file mode 100644 index 00000000..ae8adbeb --- /dev/null +++ b/include/spdlog/details/periodic_worker.h @@ -0,0 +1,80 @@ + +// +// Copyright(c) 2018 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +// periodic worker thread - peridically executes the given callback function. +// +// RAII over the owned thread: +// creates the thread on construction. +// stops and joins the thread on destruction. + +#include +#include +#include +#include +#include + +namespace spdlog +{ +namespace details { + +class periodic_worker +{ +public: + periodic_worker(std::function callback_fun, std::chrono::seconds interval) + { + + if (interval == std::chrono::seconds::zero()) + { + active_ = false; + return; + } + active_ = true; + flusher_thread_ = std::thread([callback_fun, interval, this]() + { + using std::chrono::steady_clock; + + auto last_flush_tp = steady_clock::now(); + for (;;) + { + std::unique_lock lock(this->mutex_); + this->cv_.wait_for(lock, interval, [callback_fun, interval, last_flush_tp, this] + { + return !this->active_ || (steady_clock::now() - last_flush_tp) >= interval; + }); + if (!this->active_) + { + break; + } + callback_fun(); + last_flush_tp = steady_clock::now(); + } + }); + } + + periodic_worker(const periodic_worker&) = delete; + periodic_worker &operator=(const periodic_worker &) = delete; + + // stop the back thread and join it + ~periodic_worker() + { + if (active_) + { + active_ = false; + cv_.notify_one(); + flusher_thread_.join(); + } + } + +private: + std::atomic active_; + std::thread flusher_thread_; + std::mutex mutex_; + std::condition_variable cv_; +}; +} +} \ No newline at end of file