blob: a4cfa723c07b0d3a5e899fe04c54dca810a32ea5 [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(
::aos::monotonic_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(monotonic_clock::duration duration) {
const ::aos::monotonic_clock::time_point end_time =
monotonic_now() + duration;
is_running_ = true;
while (!events_list_.empty() && is_running_) {
auto iter = events_list_.begin();
::aos::monotonic_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;
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();
}
}
} // namespace aos