blob: 26752b18f694858e11c864963ba204abbcf0ba32 [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"
Tyler Chatow67ddb032020-01-12 14:30:04 -08007#include "aos/logging/implementations.h"
Alex Perrycb7da4b2019-08-28 19:35:56 -07008
9namespace aos {
10
11EventScheduler::Token EventScheduler::Schedule(
Austin Schuhac0771c2020-01-07 18:36:30 -080012 distributed_clock::time_point time, ::std::function<void()> callback) {
Alex Perrycb7da4b2019-08-28 19:35:56 -070013 return events_list_.emplace(time, callback);
14}
15
16void EventScheduler::Deschedule(EventScheduler::Token token) {
17 events_list_.erase(token);
18}
19
Austin Schuhac0771c2020-01-07 18:36:30 -080020void EventScheduler::RunFor(distributed_clock::duration duration) {
21 const distributed_clock::time_point end_time =
22 distributed_now() + duration;
Tyler Chatow67ddb032020-01-12 14:30:04 -080023 logging::ScopedLogRestorer prev_logger;
Alex Perrycb7da4b2019-08-28 19:35:56 -070024 is_running_ = true;
Austin Schuh39788ff2019-12-01 18:22:57 -080025 for (std::function<void()> &on_run : on_run_) {
26 on_run();
27 }
28 on_run_.clear();
Alex Perrycb7da4b2019-08-28 19:35:56 -070029 while (!events_list_.empty() && is_running_) {
30 auto iter = events_list_.begin();
Austin Schuhac0771c2020-01-07 18:36:30 -080031 distributed_clock::time_point next_time = iter->first;
Alex Perrycb7da4b2019-08-28 19:35:56 -070032 if (next_time > end_time) {
33 break;
34 }
35 now_ = iter->first;
36 ::std::function<void()> callback = ::std::move(iter->second);
37 events_list_.erase(iter);
38 callback();
39 }
40 now_ = end_time;
41}
42
43void EventScheduler::Run() {
Tyler Chatow67ddb032020-01-12 14:30:04 -080044 logging::ScopedLogRestorer prev_logger;
Alex Perrycb7da4b2019-08-28 19:35:56 -070045 is_running_ = true;
Austin Schuh39788ff2019-12-01 18:22:57 -080046 for (std::function<void()> &on_run : on_run_) {
47 on_run();
48 }
49 on_run_.clear();
Alex Perrycb7da4b2019-08-28 19:35:56 -070050 while (!events_list_.empty() && is_running_) {
51 auto iter = events_list_.begin();
52 now_ = iter->first;
53 ::std::function<void()> callback = ::std::move(iter->second);
54 events_list_.erase(iter);
55 callback();
56 }
57}
58
Austin Schuhac0771c2020-01-07 18:36:30 -080059std::ostream &operator<<(std::ostream &stream,
60 const aos::distributed_clock::time_point &now) {
61 // Print it the same way we print a monotonic time. Literally.
62 stream << monotonic_clock::time_point(now.time_since_epoch());
63 return stream;
64}
65
Alex Perrycb7da4b2019-08-28 19:35:56 -070066} // namespace aos