NS-3 based Named Data Networking (NDN) simulator
ndnSIM 2.0: NDN, CCN, CCNx, content centric networks
API Documentation
scheduler.cpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
22 #include "common.hpp"
23 
24 #include "scheduler.hpp"
25 
26 namespace ns3 {
27 
29 
30 template<>
31 struct EventMemberImplObjTraits<std::function<void()>> {
32  typedef std::function<void()> T;
33  static T&
34  GetReference(T& p)
35  {
36  return p;
37  }
38 };
39 
41 
42 } // namespace ns3
43 
44 namespace ndn {
45 namespace util {
46 namespace scheduler {
47 
48 Scheduler::EventInfo::EventInfo(const time::nanoseconds& after,
49  const Event& event)
50  : m_scheduledTime(time::steady_clock::now() + after)
51  , m_event(event)
52 {
53 }
54 
55 Scheduler::EventInfo::EventInfo(const time::steady_clock::TimePoint& when,
56  const EventInfo& previousEvent)
57  : m_scheduledTime(when)
58  , m_event(previousEvent.m_event)
59  , m_eventId(previousEvent.m_eventId)
60 {
61 }
62 
63 time::nanoseconds
64 Scheduler::EventInfo::expiresFromNow() const
65 {
67  if (now > m_scheduledTime)
68  return time::seconds(0); // event should be scheduled ASAP
69  else
70  return m_scheduledTime - now;
71 }
72 
73 
74 Scheduler::Scheduler(boost::asio::io_service& ioService)
75  : m_scheduledEvent(m_events.end())
76 {
77 }
78 
80 {
82 }
83 
84 EventId
85 Scheduler::scheduleEvent(const time::nanoseconds& after, const Event& event)
86 {
87  EventId eventId = std::make_shared<ns3::EventId>();
88  weak_ptr<ns3::EventId> eventWeak = eventId;
89  std::function<void()> eventWithCleanup = [this, event, eventWeak] () {
90  event();
91  shared_ptr<ns3::EventId> eventId = eventWeak.lock();
92  if (eventId != nullptr) {
93  this->m_events.erase(eventId); // remove the event from the set after it is executed
94  }
95  };
96 
97  ns3::EventId id = ns3::Simulator::Schedule(ns3::NanoSeconds(after.count()),
98  &std::function<void()>::operator(), eventWithCleanup);
99  *eventId = std::move(id);
100  m_events.insert(eventId);
101 
102  return eventId;
103 }
104 
105 void
107 {
108  if (eventId != nullptr) {
109  ns3::Simulator::Remove(*eventId);
110  const_cast<EventId&>(eventId).reset();
111  m_events.erase(eventId);
112  }
113 }
114 
115 void
117 {
118  for (auto i = m_events.begin(); i != m_events.end(); ) {
119  auto next = i;
120  ++next; // ns3::Simulator::Remove can call cancelEvent
121  if ((*i) != nullptr) {
122  ns3::Simulator::Remove((**i));
123  const_cast<EventId&>(*i).reset();
124  }
125  i = next;
126  }
127  m_events.clear();
128 }
129 
130 } // namespace scheduler
131 } // namespace util
132 } // namespace ndn
time_point TimePoint
Definition: time.hpp:108
Copyright (c) 2011-2015 Regents of the University of California.
static time_point now() noexcept
Definition: time.cpp:79
STL namespace.
EventId scheduleEvent(const time::nanoseconds &after, const Event &event)
Schedule one time event after the specified delay.
Definition: scheduler.cpp:85
void cancelEvent(const EventId &eventId)
Cancel scheduled event.
Definition: scheduler.cpp:106
void cancelAllEvents()
Cancel all scheduled events.
Definition: scheduler.cpp:116
std::shared_ptr< ns3::EventId > EventId
Definition: scheduler.hpp:39
Opaque type (shared_ptr) representing ID of a scheduled event.
Copyright (c) 2011-2015 Regents of the University of California.