diff options
Diffstat (limited to 'include/dumb_timer_queue.h')
-rw-r--r-- | include/dumb_timer_queue.h | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/include/dumb_timer_queue.h b/include/dumb_timer_queue.h new file mode 100644 index 0000000..185725e --- /dev/null +++ b/include/dumb_timer_queue.h @@ -0,0 +1,62 @@ +#pragma once + +#include <boost/asio.hpp> +#include <deque> +#include <functional> +#include <chrono> +#include <thread> + +namespace crow +{ + namespace detail + { + // fast timer queue for fixed tick value. + class dumb_timer_queue + { + public: + // tls based queue to avoid locking + static dumb_timer_queue& get_current_dumb_timer_queue() + { + thread_local dumb_timer_queue q; + return q; + } + + void add(std::function<void()> f) + { + dq_.emplace_back(std::chrono::steady_clock::now(), std::move(f)); + } + + void process() + { + if (!io_service_) + return; + auto now = std::chrono::steady_clock::now(); + while(!dq_.empty()) + { + auto& x = dq_.front(); + if (now - x.first < std::chrono::seconds(tick)) + break; + if (x.second) + { + io_service_->post(std::move(x.second)); + } + dq_.pop_front(); + } + } + + void set_io_service(boost::asio::io_service& io_service) + { + io_service_ = &io_service; + } + + private: + dumb_timer_queue() noexcept + { + } + + int tick{5}; + boost::asio::io_service* io_service_{}; + std::deque<std::pair<decltype(std::chrono::steady_clock::now()), std::function<void()>>> dq_; + }; + } +} |