A Discrete-Event Network Simulator
API
main-test-sync.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2008 University of Washington
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
19#include "ns3/command-line.h"
20#include "ns3/simulator.h"
21#include "ns3/realtime-simulator-impl.h"
22#include "ns3/nstime.h"
23#include "ns3/log.h"
24#include "ns3/system-thread.h"
25#include "ns3/string.h"
26#include "ns3/config.h"
27#include "ns3/global-value.h"
28#include "ns3/ptr.h"
29
30#include <chrono> // seconds, milliseconds
31#include <thread> // sleep_for
32
43using namespace ns3;
44
45
46NS_LOG_COMPONENT_DEFINE ("TestSync");
47
48namespace {
49
51bool gFirstRun = false;
52
54void
55inserted_function (void)
56{
57 NS_ASSERT (gFirstRun);
58 NS_LOG_UNCOND ("inserted_function() called at " <<
59 Simulator::Now ().GetSeconds () << " s");
60}
61
63void
64background_function (void)
65{
66 NS_ASSERT (gFirstRun);
67 NS_LOG_UNCOND ("background_function() called at " <<
68 Simulator::Now ().GetSeconds () << " s");
69}
70
72void
73first_function (void)
74{
75 NS_LOG_UNCOND ("first_function() called at " <<
76 Simulator::Now ().GetSeconds () << " s");
77 gFirstRun = true;
78}
79
81class FakeNetDevice
82{
83public:
85 FakeNetDevice ();
87 void Doit3 (void);
88};
89
90FakeNetDevice::FakeNetDevice ()
91{
93}
94
95void
96FakeNetDevice::Doit3 (void)
97{
99 std::this_thread::sleep_for (std::chrono::seconds (1));
100
101 for (uint32_t i = 0; i < 10000; ++i)
102 {
103 //
104 // Exercise the realtime relative now path
105 //
106 Simulator::ScheduleWithContext (Simulator::NO_CONTEXT, Seconds (0.0), MakeEvent (&inserted_function));
107 std::this_thread::sleep_for (std::chrono::milliseconds (1));
108 }
109}
110
120void
121test (void)
122{
123 GlobalValue::Bind ("SimulatorImplementationType",
124 StringValue ("ns3::RealtimeSimulatorImpl"));
125
126 FakeNetDevice fnd;
127
128 //
129 // Make sure ScheduleNow works when the system isn't running
130 //
131 Simulator::ScheduleWithContext (0xffffffff, Seconds (0.0), MakeEvent (&first_function));
132
133 //
134 // drive the progression of m_currentTs at a ten millisecond rate from the main thread
135 //
136 for (double d = 0.; d < 14.999; d += 0.01)
137 {
138 Simulator::Schedule (Seconds (d), &background_function);
139 }
140
141 Ptr<SystemThread> st3 = Create<SystemThread> (
142 MakeCallback (&FakeNetDevice::Doit3, &fnd));
143 st3->Start ();
144
145 Simulator::Stop (Seconds (15.0));
146 Simulator::Run ();
147 st3->Join ();
148 Simulator::Destroy ();
149}
150
151} // unnamed namespace
152
153
154int
155main (int argc, char *argv[])
156{
157 CommandLine cmd (__FILE__);
158 cmd.Parse (argc, argv);
159
160 while (true)
161 {
162 test ();
163 }
164}
165
Parse command-line arguments.
Definition: command-line.h:229
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
Hold variables of type string.
Definition: string.h:41
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition: assert.h:67
#define NS_LOG_UNCOND(msg)
Output the requested message unconditionally.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
EventImpl * MakeEvent(void(*f)(void))
Make an EventImpl from a function pointer taking varying numbers of arguments.
Definition: make-event.cc:34
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:287
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:1648
cmd
Definition: second.py:35