A Discrete-Event Network Simulator
API
simulator.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2005,2006 INRIA
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
19  */
20 #include "ns3/core-config.h"
21 #include "simulator.h"
22 #include "simulator-impl.h"
23 #include "scheduler.h"
24 #include "map-scheduler.h"
25 #include "event-impl.h"
26 #include "des-metrics.h"
27 
28 #include "ptr.h"
29 #include "string.h"
30 #include "object-factory.h"
31 #include "global-value.h"
32 #include "assert.h"
33 #include "log.h"
34 
35 #include <cmath>
36 #include <fstream>
37 #include <list>
38 #include <vector>
39 #include <iostream>
40 #include <iomanip>
41 
49 namespace ns3 {
50 
51 // Note: Logging in this file is largely avoided due to the
52 // number of calls that are made to these functions and the possibility
53 // of causing recursions leading to stack overflow
54 NS_LOG_COMPONENT_DEFINE ("Simulator");
55 
64  ("SimulatorImplementationType",
65  "The object class to use as the simulator implementation",
66  StringValue ("ns3::DefaultSimulatorImpl"),
68 
76 static GlobalValue g_schedTypeImpl = GlobalValue ("SchedulerType",
77  "The object class to use as the scheduler implementation",
80 
86 static SimulatorImpl ** PeekImpl (void)
87 {
88  static SimulatorImpl *impl = 0;
89  return &impl;
90 }
91 
98 static SimulatorImpl * GetImpl (void)
99 {
100  SimulatorImpl **pimpl = PeekImpl ();
101  /* Please, don't include any calls to logging macros in this function
102  * or pay the price, that is, stack explosions.
103  */
104  if (*pimpl == 0)
105  {
106  {
107  ObjectFactory factory;
108  StringValue s;
109 
111  factory.SetTypeId (s.Get ());
112  *pimpl = GetPointer (factory.Create<SimulatorImpl> ());
113  }
114  {
115  ObjectFactory factory;
116  StringValue s;
118  factory.SetTypeId (s.Get ());
119  (*pimpl)->SetScheduler (factory);
120  }
121 
122 //
123 // Note: we call LogSetTimePrinter _after_ creating the implementation
124 // object because the act of creation can trigger calls to the logging
125 // framework which would call the TimePrinter function which would call
126 // Simulator::Now which would call Simulator::GetImpl, and, thus, get us
127 // in an infinite recursion until the stack explodes.
128 //
131  }
132  return *pimpl;
133 }
134 
135 void
137 {
139 
140  SimulatorImpl **pimpl = PeekImpl ();
141  if (*pimpl == 0)
142  {
143  return;
144  }
145  /* Note: we have to call LogSetTimePrinter (0) below because if we do not do
146  * this, and restart a simulation after this call to Destroy, (which is
147  * legal), Simulator::GetImpl will trigger again an infinite recursion until
148  * the stack explodes.
149  */
150  LogSetTimePrinter (0);
151  LogSetNodePrinter (0);
152  (*pimpl)->Destroy ();
153  (*pimpl)->Unref ();
154  *pimpl = 0;
155 }
156 
157 void
159 {
160  NS_LOG_FUNCTION (schedulerFactory);
161  GetImpl ()->SetScheduler (schedulerFactory);
162 }
163 
164 bool
166 {
168  return GetImpl ()->IsFinished ();
169 }
170 
171 void
173 {
176  GetImpl ()->Run ();
177 }
178 
179 void
181 {
183  NS_LOG_LOGIC ("stop");
184  GetImpl ()->Stop ();
185 }
186 
187 void
188 Simulator::Stop (Time const &delay)
189 {
190  NS_LOG_FUNCTION (delay);
191  GetImpl ()->Stop (delay);
192 }
193 
194 Time
196 {
197  /* Please, don't include any calls to logging macros in this function
198  * or pay the price, that is, stack explosions.
199  */
200  return GetImpl ()->Now ();
201 }
202 
203 Time
205 {
206  NS_LOG_FUNCTION (&id);
207  return GetImpl ()->GetDelayLeft (id);
208 }
209 
210 EventId
211 Simulator::Schedule (Time const &delay, const Ptr<EventImpl> &event)
212 {
213  return DoSchedule (delay, GetPointer (event));
214 }
215 
216 EventId
218 {
219  return DoScheduleNow (GetPointer (ev));
220 }
221 void
222 Simulator::ScheduleWithContext (uint32_t context, const Time &delay, EventImpl *impl)
223 {
224 #ifdef ENABLE_DES_METRICS
225  DesMetrics::Get ()->TraceWithContext (context, Now (), delay);
226 #endif
227  return GetImpl ()->ScheduleWithContext (context, delay, impl);
228 }
229 EventId
231 {
232  return DoScheduleDestroy (GetPointer (ev));
233 }
234 EventId
236 {
237 #ifdef ENABLE_DES_METRICS
238  DesMetrics::Get ()->Trace (Now (), time);
239 #endif
240  return GetImpl ()->Schedule (time, impl);
241 }
242 EventId
244 {
245 #ifdef ENABLE_DES_METRICS
246  DesMetrics::Get ()->Trace (Now (), Time (0));
247 #endif
248  return GetImpl ()->ScheduleNow (impl);
249 }
250 EventId
252 {
253  return GetImpl ()->ScheduleDestroy (impl);
254 }
255 
256 
257 void
259 {
260  if (*PeekImpl () == 0)
261  {
262  return;
263  }
264  return GetImpl ()->Remove (id);
265 }
266 
267 void
269 {
270  if (*PeekImpl () == 0)
271  {
272  return;
273  }
274  return GetImpl ()->Cancel (id);
275 }
276 
277 bool
279 {
280  if (*PeekImpl () == 0)
281  {
282  return true;
283  }
284  return GetImpl ()->IsExpired (id);
285 }
286 
287 Time Now (void)
288 {
289  return Simulator::Now ();
290 }
291 
292 Time
294 {
296  return GetImpl ()->GetMaximumSimulationTime ();
297 }
298 
299 uint32_t
301 {
302  return GetImpl ()->GetContext ();
303 }
304 
305 uint64_t
307 {
308  return GetImpl ()->GetEventCount ();
309 }
310 
311 uint32_t
313 {
315 
316  if (*PeekImpl () != 0)
317  {
318  return GetImpl ()->GetSystemId ();
319  }
320  else
321  {
322  return 0;
323  }
324 }
325 
326 void
328 {
329  NS_LOG_FUNCTION (impl);
330  if (*PeekImpl () != 0)
331  {
332  NS_FATAL_ERROR ("It is not possible to set the implementation after calling any Simulator:: function. Call Simulator::SetImplementation earlier or after Simulator::Destroy.");
333  }
334  *PeekImpl () = GetPointer (impl);
335  // Set the default scheduler
336  ObjectFactory factory;
337  StringValue s;
339  factory.SetTypeId (s.Get ());
340  impl->SetScheduler (factory);
341 //
342 // Note: we call LogSetTimePrinter _after_ creating the implementation
343 // object because the act of creation can trigger calls to the logging
344 // framework which would call the TimePrinter function which would call
345 // Simulator::Now which would call Simulator::GetImpl, and, thus, get us
346 // in an infinite recursion until the stack explodes.
347 //
350 }
351 
354 {
356  return GetImpl ();
357 }
358 
359 
360 
361 } // namespace ns3
362 
NS_ASSERT() and NS_ASSERT_MSG() macro definitions.
void Trace(const Time &now, const Time &delay)
Trace an event to self at the time it is scheduled.
Definition: des-metrics.cc:102
void TraceWithContext(uint32_t context, const Time &now, const Time &delay)
Trace an event (with context) at the time it is scheduled.
Definition: des-metrics.cc:108
An identifier for simulation events.
Definition: event-id.h:54
A simulation event.
Definition: event-impl.h:45
Hold a so-called 'global value'.
Definition: global-value.h:74
void GetValue(AttributeValue &value) const
Get the value.
static TypeId GetTypeId(void)
Register this type.
Instantiate subclasses of ns3::Object.
Ptr< Object > Create(void) const
Create an Object instance of the configured TypeId.
void SetTypeId(TypeId tid)
Set the TypeId of the Objects to be created by this factory.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
static EventId DoScheduleDestroy(EventImpl *event)
Implementation of the various ScheduleDestroy methods.
Definition: simulator.cc:251
static void Cancel(const EventId &id)
Set the cancel bit on this event: the event's associated function will not be invoked when it expires...
Definition: simulator.cc:268
static void Stop(void)
Tell the Simulator the calling event should be the last one executed.
Definition: simulator.cc:180
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:136
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition: simulator.h:556
static EventId DoSchedule(Time const &delay, EventImpl *event)
Implementation of the various Schedule methods.
Definition: simulator.cc:235
static void ScheduleWithContext(uint32_t context, Time const &delay, FUNC f, Ts &&... args)
Schedule an event with the given context.
Definition: simulator.h:571
static bool IsExpired(const EventId &id)
Check if an event has already run or been cancelled.
Definition: simulator.cc:278
static void Run(void)
Run the simulation.
Definition: simulator.cc:172
static uint32_t GetContext(void)
Get the current simulation context.
Definition: simulator.cc:300
static EventId ScheduleDestroy(FUNC f, Ts &&... args)
Schedule an event to run at the end of the simulation, when Simulator::Destroy() is called.
Definition: simulator.h:605
static void SetScheduler(ObjectFactory schedulerFactory)
Set the scheduler type with an ObjectFactory.
Definition: simulator.cc:158
static EventId DoScheduleNow(EventImpl *event)
Implementation of the various ScheduleNow methods.
Definition: simulator.cc:243
static bool IsFinished(void)
Check if the simulation should finish.
Definition: simulator.cc:165
static Time GetMaximumSimulationTime(void)
Get the maximum representable simulation time.
Definition: simulator.cc:293
static EventId ScheduleNow(FUNC f, Ts &&... args)
Schedule an event to expire Now.
Definition: simulator.h:587
static Time Now(void)
Return the current simulation virtual time.
Definition: simulator.cc:195
static uint32_t GetSystemId(void)
Get the system id of this simulator.
Definition: simulator.cc:312
static void Remove(const EventId &id)
Remove an event from the event list.
Definition: simulator.cc:258
static void SetImplementation(Ptr< SimulatorImpl > impl)
Definition: simulator.cc:327
static Time GetDelayLeft(const EventId &id)
Get the remaining time until this event will execute.
Definition: simulator.cc:204
static uint64_t GetEventCount(void)
Get the number of events executed.
Definition: simulator.cc:306
static Ptr< SimulatorImpl > GetImplementation(void)
Get the SimulatorImpl singleton.
Definition: simulator.cc:353
The SimulatorImpl base class.
virtual EventId ScheduleDestroy(EventImpl *event)=0
Schedule an event to run at the end of the simulation, after the Stop() time or condition has been re...
virtual Time GetMaximumSimulationTime(void) const =0
Get the maximum representable simulation time.
virtual Time GetDelayLeft(const EventId &id) const =0
Get the remaining time until this event will execute.
virtual void SetScheduler(ObjectFactory schedulerFactory)=0
Set the Scheduler to be used to manage the event list.
virtual uint32_t GetSystemId() const =0
Get the system id of this simulator.
virtual EventId Schedule(const Time &delay, EventImpl *event)=0
Schedule a future event execution (in the same context).
virtual bool IsExpired(const EventId &id) const =0
Check if an event has already run or been cancelled.
virtual void Run(void)=0
Run the simulation.
virtual void Remove(const EventId &id)=0
Remove an event from the event list.
virtual void ScheduleWithContext(uint32_t context, const Time &delay, EventImpl *event)=0
Schedule a future event execution (in a different context).
virtual uint32_t GetContext(void) const =0
Get the current simulation context.
virtual EventId ScheduleNow(EventImpl *event)=0
Schedule an event to run at the current virtual time.
virtual Time Now(void) const =0
Return the current simulation virtual time.
virtual void Cancel(const EventId &id)=0
Set the cancel bit on this event: the event's associated function will not be invoked when it expires...
virtual void Stop(void)=0
Tell the Simulator the calling event should be the last one executed.
virtual bool IsFinished(void) const =0
Check if the simulation should finish.
virtual uint64_t GetEventCount(void) const =0
Get the number of events executed.
static DesMetrics * Get(void)
Get a pointer to the singleton instance.
Definition: singleton.h:100
Hold variables of type string.
Definition: string.h:41
std::string Get(void) const
Definition: string.cc:31
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
static void ClearMarkedTimes()
Remove all MarkedTimes.
Definition: time.cc:287
AttributeValue implementation for TypeId.
Definition: type-id.h:595
ns3::DesMetrics declaration.
ns3::EventImpl declarations.
ns3::GlobalValue declaration.
Ptr< const AttributeChecker > MakeStringChecker(void)
Definition: string.cc:30
Ptr< const AttributeChecker > MakeTypeIdChecker(void)
Definition: type-id.cc:1226
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:289
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
void DefaultNodePrinter(std::ostream &os)
Default node id printer implementation.
Definition: node-printer.cc:38
static GlobalValue g_schedTypeImpl
The specific event scheduler implementation to use.
Definition: simulator.cc:76
static SimulatorImpl ** PeekImpl(void)
Get the static SimulatorImpl instance.
Definition: simulator.cc:86
static SimulatorImpl * GetImpl(void)
Get the SimulatorImpl singleton.
Definition: simulator.cc:98
static GlobalValue g_simTypeImpl
The specific simulator implementation to use.
Definition: simulator.cc:63
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:287
Debug message logging.
ns3::MapScheduler declaration.
void(* Time)(Time oldValue, Time newValue)
TracedValue callback signature for Time.
Definition: nstime.h:793
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void LogSetTimePrinter(TimePrinter printer)
Set the TimePrinter function to be used to prepend log messages with the simulation time.
Definition: log.cc:620
U * GetPointer(const Ptr< U > &p)
Definition: ptr.h:421
void DefaultTimePrinter(std::ostream &os)
Default Time printer.
Definition: time-printer.cc:39
void LogSetNodePrinter(NodePrinter printer)
Set the LogNodePrinter function to be used to prepend log messages with the node id.
Definition: log.cc:634
ns3::ObjectFactory class declaration.
ns3::Ptr smart pointer declaration and implementation.
ns3::Scheduler abstract base class, ns3::Scheduler::Event and ns3::Scheduler::EventKey declarations.
ns3::SimulatorImpl declaration.
ns3::Simulator declaration.
ns3::StringValue attribute value declarations.