blob: a4cfa723c07b0d3a5e899fe04c54dca810a32ea5 [file] [log] [blame]
Alex Perrycb7da4b2019-08-28 19:35:56 -07001#include "aos/events/event_scheduler.h"
2
3#include <algorithm>
4#include <deque>
5
6#include "aos/events/event_loop.h"
7
8namespace aos {
9
10EventScheduler::Token EventScheduler::Schedule(
11 ::aos::monotonic_clock::time_point time, ::std::function<void()> callback) {
12 return events_list_.emplace(time, callback);
13}
14
15void EventScheduler::Deschedule(EventScheduler::Token token) {
16 events_list_.erase(token);
17}
18
19void EventScheduler::RunFor(monotonic_clock::duration duration) {
20 const ::aos::monotonic_clock::time_point end_time =
21 monotonic_now() + duration;
22 is_running_ = true;
23 while (!events_list_.empty() && is_running_) {
24 auto iter = events_list_.begin();
25 ::aos::monotonic_clock::time_point next_time = iter->first;
26 if (next_time > end_time) {
27 break;
28 }
29 now_ = iter->first;
30 ::std::function<void()> callback = ::std::move(iter->second);
31 events_list_.erase(iter);
32 callback();
33 }
34 now_ = end_time;
35}
36
37void EventScheduler::Run() {
38 is_running_ = true;
39 while (!events_list_.empty() && is_running_) {
40 auto iter = events_list_.begin();
41 now_ = iter->first;
42 ::std::function<void()> callback = ::std::move(iter->second);
43 events_list_.erase(iter);
44 callback();
45 }
46}
47
48} // namespace aos