Electroneum
dumb_timer_queue.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <boost/asio.hpp>
4 #include <deque>
5 #include <functional>
6 #include <chrono>
7 #include <thread>
8 
9 #include "logging.h"
10 
11 namespace crow
12 {
13  namespace detail
14  {
15  // fast timer queue for fixed tick value.
17  {
18  public:
19  using key = std::pair<dumb_timer_queue*, int>;
20 
21  void cancel(key& k)
22  {
23  auto self = k.first;
24  k.first = nullptr;
25  if (!self)
26  return;
27 
28  unsigned int index = (unsigned int)(k.second - self->step_);
29  if (index < self->dq_.size())
30  self->dq_[index].second = nullptr;
31  }
32 
33  key add(std::function<void()> f)
34  {
35  dq_.emplace_back(std::chrono::steady_clock::now(), std::move(f));
36  int ret = step_+dq_.size()-1;
37 
38  CROW_LOG_DEBUG << "timer add inside: " << this << ' ' << ret ;
39  return {this, ret};
40  }
41 
42  void process()
43  {
44  if (!io_service_)
45  return;
46 
47  auto now = std::chrono::steady_clock::now();
48  while(!dq_.empty())
49  {
50  auto& x = dq_.front();
51  if (now - x.first < std::chrono::seconds(tick))
52  break;
53  if (x.second)
54  {
55  CROW_LOG_DEBUG << "timer call: " << this << ' ' << step_;
56  // we know that timer handlers are very simple currenty; call here
57  x.second();
58  }
59  dq_.pop_front();
60  step_++;
61  }
62  }
63 
64  void set_io_service(boost::asio::io_service& io_service)
65  {
66  io_service_ = &io_service;
67  }
68 
69  dumb_timer_queue() noexcept
70  {
71  }
72 
73  private:
74 
75  int tick{5};
76  boost::asio::io_service* io_service_{};
77  std::deque<std::pair<decltype(std::chrono::steady_clock::now()), std::function<void()>>> dq_;
78  int step_{};
79  };
80  }
81 }
int step_
Definition: dumb_timer_queue.h:78
void process()
Definition: dumb_timer_queue.h:42
dumb_timer_queue() noexcept
Definition: dumb_timer_queue.h:69
Definition: dumb_timer_queue.h:16
int tick
Definition: dumb_timer_queue.h:75
declaration and default definition for the functions used the API
#define CROW_LOG_DEBUG
Definition: logging.h:139
std::pair< dumb_timer_queue *, int > key
Definition: dumb_timer_queue.h:19
boost::asio::io_service * io_service_
Definition: dumb_timer_queue.h:76
Definition: ci_map.h:7
void set_io_service(boost::asio::io_service &io_service)
Definition: dumb_timer_queue.h:64
key add(std::function< void()> f)
Definition: dumb_timer_queue.h:33
void cancel(key &k)
Definition: dumb_timer_queue.h:21
std::deque< std::pair< decltype(std::chrono::steady_clock::now()), std::function< void()> > > dq_
Definition: dumb_timer_queue.h:77