Alex Perry | cb7da4b | 2019-08-28 19:35:56 -0700 | [diff] [blame] | 1 | #include "aos/events/event_scheduler.h" |
| 2 | |
| 3 | #include <algorithm> |
| 4 | #include <deque> |
| 5 | |
| 6 | #include "aos/events/event_loop.h" |
Tyler Chatow | 67ddb03 | 2020-01-12 14:30:04 -0800 | [diff] [blame] | 7 | #include "aos/logging/implementations.h" |
Alex Perry | cb7da4b | 2019-08-28 19:35:56 -0700 | [diff] [blame] | 8 | |
| 9 | namespace aos { |
| 10 | |
| 11 | EventScheduler::Token EventScheduler::Schedule( |
Austin Schuh | ac0771c | 2020-01-07 18:36:30 -0800 | [diff] [blame] | 12 | distributed_clock::time_point time, ::std::function<void()> callback) { |
Alex Perry | cb7da4b | 2019-08-28 19:35:56 -0700 | [diff] [blame] | 13 | return events_list_.emplace(time, callback); |
| 14 | } |
| 15 | |
| 16 | void EventScheduler::Deschedule(EventScheduler::Token token) { |
| 17 | events_list_.erase(token); |
| 18 | } |
| 19 | |
Austin Schuh | ac0771c | 2020-01-07 18:36:30 -0800 | [diff] [blame] | 20 | void EventScheduler::RunFor(distributed_clock::duration duration) { |
| 21 | const distributed_clock::time_point end_time = |
| 22 | distributed_now() + duration; |
Tyler Chatow | 67ddb03 | 2020-01-12 14:30:04 -0800 | [diff] [blame] | 23 | logging::ScopedLogRestorer prev_logger; |
Alex Perry | cb7da4b | 2019-08-28 19:35:56 -0700 | [diff] [blame] | 24 | is_running_ = true; |
Austin Schuh | 39788ff | 2019-12-01 18:22:57 -0800 | [diff] [blame] | 25 | for (std::function<void()> &on_run : on_run_) { |
| 26 | on_run(); |
| 27 | } |
| 28 | on_run_.clear(); |
Alex Perry | cb7da4b | 2019-08-28 19:35:56 -0700 | [diff] [blame] | 29 | while (!events_list_.empty() && is_running_) { |
| 30 | auto iter = events_list_.begin(); |
Austin Schuh | ac0771c | 2020-01-07 18:36:30 -0800 | [diff] [blame] | 31 | distributed_clock::time_point next_time = iter->first; |
Alex Perry | cb7da4b | 2019-08-28 19:35:56 -0700 | [diff] [blame] | 32 | 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 | |
| 43 | void EventScheduler::Run() { |
Tyler Chatow | 67ddb03 | 2020-01-12 14:30:04 -0800 | [diff] [blame] | 44 | logging::ScopedLogRestorer prev_logger; |
Alex Perry | cb7da4b | 2019-08-28 19:35:56 -0700 | [diff] [blame] | 45 | is_running_ = true; |
Austin Schuh | 39788ff | 2019-12-01 18:22:57 -0800 | [diff] [blame] | 46 | for (std::function<void()> &on_run : on_run_) { |
| 47 | on_run(); |
| 48 | } |
| 49 | on_run_.clear(); |
Alex Perry | cb7da4b | 2019-08-28 19:35:56 -0700 | [diff] [blame] | 50 | 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 Schuh | ac0771c | 2020-01-07 18:36:30 -0800 | [diff] [blame] | 59 | std::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 Perry | cb7da4b | 2019-08-28 19:35:56 -0700 | [diff] [blame] | 66 | } // namespace aos |