Vanetza
 
Loading...
Searching...
No Matches
manual_runtime.cpp
1#include "manual_runtime.hpp"
2#include <cassert>
3
4namespace vanetza
5{
6
7ManualRuntime::ManualRuntime(Clock::time_point init) : m_now(init)
8{
9}
10
11void ManualRuntime::schedule(Clock::time_point tp, const Callback& cb, const void* scope)
12{
13 m_queue.emplace(queue_type::value_type { tp, cb, scope });
14}
15
16void ManualRuntime::schedule(Clock::duration d, const Callback& cb, const void* scope)
17{
18 schedule(m_now + d, cb, scope);
19}
20
21void ManualRuntime::cancel(const void* scope)
22{
23 if (scope) {
24 auto scope_match_range = m_queue.get<by_scope>().equal_range(scope);
25 m_queue.get<by_scope>().erase(scope_match_range.first, scope_match_range.second);
26 }
27}
28
29Clock::time_point ManualRuntime::next() const
30{
31 Clock::time_point next_tp = Clock::time_point::max();
32 if (!m_queue.empty()) {
33 next_tp = m_queue.get<by_deadline>().begin()->deadline;
34 }
35 return next_tp;
36}
37
38Clock::time_point ManualRuntime::now() const
39{
40 return m_now;
41}
42
43void ManualRuntime::trigger(Clock::time_point tp)
44{
45 // require monotonic clock
46 assert(tp >= m_now);
47 m_now = tp;
48 trigger();
49}
50
51void ManualRuntime::trigger(Clock::duration d)
52{
53 m_now += d;
54 trigger();
55}
56
57void ManualRuntime::trigger()
58{
59 // process queue elements separately because callback might modify runtime
60 while (!m_queue.empty()) {
61 auto top = m_queue.get<by_deadline>().begin();
62 const auto deadline = top->deadline; // copy of deadline on purpose (erase before callback)
63 if (deadline <= m_now) {
64 Callback cb = top->callback;
65 m_queue.get<by_deadline>().erase(top);
66 // callback invocation has to be last action because it might modify runtime
67 cb(deadline);
68 } else {
69 break;
70 }
71 }
72}
73
74void ManualRuntime::reset(Clock::time_point tp)
75{
76 m_now = tp;
77 queue_type queue;
78 swap(queue, m_queue);
79
80 // invoke all callbacks once so they can re-schedule
81 for (auto& item : queue) {
82 const auto& deadline = item.deadline;
83 auto& callback = item.callback;
84 // callback might modify m_queue
85 callback(deadline);
86 }
87}
88
89} // namespace vanetza
void trigger(Clock::time_point tp)
void cancel(const void *scope) override
Clock::time_point next() const
void reset(Clock::time_point tp)
Clock::time_point now() const override
void schedule(Clock::time_point, const Callback &, const void *=nullptr) override