blob: 57f20aeeeb8ad4a276af91b231d50f75cb89aca6 [file] [log] [blame]
#include "aos/events/event_scheduler.h"
#include <algorithm>
#include <deque>
#include "aos/events/event_loop.h"
namespace aos {
EventScheduler::Token EventScheduler::Schedule(
distributed_clock::time_point time, ::std::function<void()> callback) {
return events_list_.emplace(time, callback);
}
void EventScheduler::Deschedule(EventScheduler::Token token) {
events_list_.erase(token);
}
void EventScheduler::RunFor(distributed_clock::duration duration) {
const distributed_clock::time_point end_time =
distributed_now() + duration;
is_running_ = true;
for (std::function<void()> &on_run : on_run_) {
on_run();
}
on_run_.clear();
while (!events_list_.empty() && is_running_) {
auto iter = events_list_.begin();
distributed_clock::time_point next_time = iter->first;
if (next_time > end_time) {
break;
}
now_ = iter->first;
::std::function<void()> callback = ::std::move(iter->second);
events_list_.erase(iter);
callback();
}
now_ = end_time;
}
void EventScheduler::Run() {
is_running_ = true;
for (std::function<void()> &on_run : on_run_) {
on_run();
}
on_run_.clear();
while (!events_list_.empty() && is_running_) {
auto iter = events_list_.begin();
now_ = iter->first;
::std::function<void()> callback = ::std::move(iter->second);
events_list_.erase(iter);
callback();
}
}
std::ostream &operator<<(std::ostream &stream,
const aos::distributed_clock::time_point &now) {
// Print it the same way we print a monotonic time. Literally.
stream << monotonic_clock::time_point(now.time_since_epoch());
return stream;
}
} // namespace aos