blob: 57f20aeeeb8ad4a276af91b231d50f75cb89aca6 [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(
Austin Schuhac0771c2020-01-07 18:36:30 -080011 distributed_clock::time_point time, ::std::function<void()> callback) {
Alex Perrycb7da4b2019-08-28 19:35:56 -070012 return events_list_.emplace(time, callback);
13}
14
15void EventScheduler::Deschedule(EventScheduler::Token token) {
16 events_list_.erase(token);
17}
18
Austin Schuhac0771c2020-01-07 18:36:30 -080019void EventScheduler::RunFor(distributed_clock::duration duration) {
20 const distributed_clock::time_point end_time =
21 distributed_now() + duration;
Alex Perrycb7da4b2019-08-28 19:35:56 -070022 is_running_ = true;
Austin Schuh39788ff2019-12-01 18:22:57 -080023 for (std::function<void()> &on_run : on_run_) {
24 on_run();
25 }
26 on_run_.clear();
Alex Perrycb7da4b2019-08-28 19:35:56 -070027 while (!events_list_.empty() && is_running_) {
28 auto iter = events_list_.begin();
Austin Schuhac0771c2020-01-07 18:36:30 -080029 distributed_clock::time_point next_time = iter->first;
Alex Perrycb7da4b2019-08-28 19:35:56 -070030 if (next_time > end_time) {
31 break;
32 }
33 now_ = iter->first;
34 ::std::function<void()> callback = ::std::move(iter->second);
35 events_list_.erase(iter);
36 callback();
37 }
38 now_ = end_time;
39}
40
41void EventScheduler::Run() {
42 is_running_ = true;
Austin Schuh39788ff2019-12-01 18:22:57 -080043 for (std::function<void()> &on_run : on_run_) {
44 on_run();
45 }
46 on_run_.clear();
Alex Perrycb7da4b2019-08-28 19:35:56 -070047 while (!events_list_.empty() && is_running_) {
48 auto iter = events_list_.begin();
49 now_ = iter->first;
50 ::std::function<void()> callback = ::std::move(iter->second);
51 events_list_.erase(iter);
52 callback();
53 }
54}
55
Austin Schuhac0771c2020-01-07 18:36:30 -080056std::ostream &operator<<(std::ostream &stream,
57 const aos::distributed_clock::time_point &now) {
58 // Print it the same way we print a monotonic time. Literally.
59 stream << monotonic_clock::time_point(now.time_since_epoch());
60 return stream;
61}
62
Alex Perrycb7da4b2019-08-28 19:35:56 -070063} // namespace aos