23 #include <boost/scope_exit.hpp>
33 :
expireTime(time::steady_clock::now() + after)
55 return m_info.expired() || m_info.lock()->isExpired;
61 return (!(*
this) && !other) ||
62 !(m_info.owner_before(other.m_info) || other.m_info.owner_before(m_info));
68 return os << eventId.m_info.lock();
74 return a->expireTime < b->expireTime;
78 : m_deadlineTimer(ioService)
79 , m_isEventExecuting(false)
86 BOOST_ASSERT(callback !=
nullptr);
88 EventQueue::iterator i = m_queue.insert(make_shared<EventInfo>(after, callback));
91 if (!m_isEventExecuting && i == m_queue.begin()) {
102 shared_ptr<EventInfo> info = eventId.m_info.lock();
103 if (info ==
nullptr || info->isExpired) {
107 if (info->queueIt == m_queue.begin()) {
108 m_deadlineTimer.cancel();
110 m_queue.erase(info->queueIt);
112 if (!m_isEventExecuting) {
113 this->scheduleNext();
121 m_deadlineTimer.cancel();
125 Scheduler::scheduleNext()
127 if (!m_queue.empty()) {
128 m_deadlineTimer.expires_from_now((*m_queue.begin())->expiresFromNow());
129 m_deadlineTimer.async_wait(bind(&Scheduler::executeEvent,
this, _1));
134 Scheduler::executeEvent(
const boost::system::error_code& error)
140 m_isEventExecuting =
true;
142 BOOST_SCOPE_EXIT_ALL(
this) {
143 m_isEventExecuting =
false;
144 this->scheduleNext();
149 while (!m_queue.empty()) {
150 EventQueue::iterator head = m_queue.begin();
151 shared_ptr<EventInfo> info = *head;
152 if (info->expireTime > now) {
157 info->isExpired =
true;
function< void()> EventCallback
Function to be invoked when a scheduled event expires.
Copyright (c) 2013-2016 Regents of the University of California.
bool operator()(const shared_ptr< EventInfo > &a, const shared_ptr< EventInfo > &b) const
static time_point now() noexcept
EventQueue::const_iterator queueIt
time::nanoseconds expiresFromNow() const
void cancelEvent(const EventId &eventId)
Cancel a scheduled event.
void cancelAllEvents()
Cancel all scheduled events.
Scheduler(boost::asio::io_service &ioService)
EventInfo(time::nanoseconds after, const EventCallback &callback)
bool operator==(const EventId &other) const
EventId scheduleEvent(const time::nanoseconds &after, const EventCallback &callback)
Schedule a one-time event after the specified delay.
Identifies a scheduled event.
std::ostream & operator<<(std::ostream &os, const EventId &eventId)
time::steady_clock::TimePoint expireTime