blob: 894886054622234441e3d4728d4ef7bfd896336e [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Alexander Afanasyevf6468892014-01-29 01:04:14 -08002/**
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -08003 * Copyright (c) 2013-2015 Regents of the University of California.
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07006 *
Alexander Afanasyevc169a812014-05-20 20:37:29 -04007 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
Alexander Afanasyevf6468892014-01-29 01:04:14 -080020 */
21
22#ifndef NDN_UTIL_SCHEDULER_HPP
23#define NDN_UTIL_SCHEDULER_HPP
24
25#include "../common.hpp"
26#include "monotonic_deadline_timer.hpp"
27
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -070028#include <set>
29
Alexander Afanasyevf6468892014-01-29 01:04:14 -080030namespace ndn {
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -080031namespace util {
32namespace scheduler {
Alexander Afanasyevf6468892014-01-29 01:04:14 -080033
34struct EventIdImpl; ///< \brief Private storage of information about the event
35/**
36 * \brief Opaque type (shared_ptr) representing ID of the scheduled event
37 */
38typedef shared_ptr<EventIdImpl> EventId;
39
40/**
41 * \brief Generic scheduler
42 */
43class Scheduler
44{
45public:
46 typedef function<void()> Event;
47
48 Scheduler(boost::asio::io_service& ioService);
49
50 /**
51 * \brief Schedule one time event after the specified delay
52 * \returns EventId that can be used to cancel the scheduled event
53 */
54 EventId
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -070055 scheduleEvent(const time::nanoseconds& after, const Event& event);
Alexander Afanasyevf6468892014-01-29 01:04:14 -080056
57 /**
Alexander Afanasyevf6468892014-01-29 01:04:14 -080058 * \brief Cancel scheduled event
59 */
60 void
61 cancelEvent(const EventId& eventId);
62
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -070063 /**
64 * \brief Cancel all scheduled events
65 */
66 void
67 cancelAllEvents();
68
Alexander Afanasyevf6468892014-01-29 01:04:14 -080069private:
70 void
71 onEvent(const boost::system::error_code& code);
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070072
Alexander Afanasyevf6468892014-01-29 01:04:14 -080073private:
Alexander Afanasyevf6468892014-01-29 01:04:14 -080074 struct EventInfo
75 {
Alexander Afanasyev72a11782014-06-19 13:46:57 -070076 EventInfo(const time::nanoseconds& after, const Event& event);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -070077
78 EventInfo(const time::steady_clock::TimePoint& when, const EventInfo& previousEvent);
Alexander Afanasyevf6468892014-01-29 01:04:14 -080079
80 bool
81 operator <=(const EventInfo& other) const
82 {
83 return this->m_scheduledTime <= other.m_scheduledTime;
84 }
85
86 bool
87 operator <(const EventInfo& other) const
88 {
89 return this->m_scheduledTime < other.m_scheduledTime;
90 }
91
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -070092 time::nanoseconds
Alexander Afanasyevf6468892014-01-29 01:04:14 -080093 expiresFromNow() const;
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070094
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -070095 time::steady_clock::TimePoint m_scheduledTime;
Alexander Afanasyevf6468892014-01-29 01:04:14 -080096 Event m_event;
97 mutable EventId m_eventId;
98 };
99
100 typedef std::multiset<EventInfo> EventQueue;
101 friend struct EventIdImpl;
102
103 EventQueue m_events;
104 EventQueue::iterator m_scheduledEvent;
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700105 monotonic_deadline_timer m_deadlineTimer;
Yingdi Yuf2a82092014-02-03 16:49:15 -0800106
107 bool m_isEventExecuting;
Alexander Afanasyevf6468892014-01-29 01:04:14 -0800108};
109
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800110} // namespace scheduler
111
112using util::scheduler::Scheduler;
113
114} // namespace util
115
116// for backwards compatibility
117using util::scheduler::Scheduler;
118using util::scheduler::EventId;
119
Alexander Afanasyevf6468892014-01-29 01:04:14 -0800120} // namespace ndn
121
122#endif // NDN_UTIL_SCHEDULER_HPP