23#include <condition_variable>
78 m_jiffy = std::chrono::system_clock::period::num * std::nano::den /
79 std::chrono::system_clock::period::den;
146 return (int64_t)(nsNow - ns);
154 return -(int64_t)(ns - nsNow);
197 uint64_t numberJiffies = ns /
m_jiffy;
198 NS_LOG_INFO(
"Synchronize numberJiffies = " << numberJiffies);
220 if (numberJiffies > 3)
253 int64_t nsDrift =
DoGetDrift(nsCurrent + nsDelay);
261 NS_LOG_INFO(
"Back from SleepWait: IML8 " << nsDrift);
271 NS_LOG_INFO(
"SpinWait until " << nsCurrent + nsDelay);
272 return SpinWait(nsCurrent + nsDelay);
280 std::unique_lock<std::mutex> lock(
m_mutex);
337 std::unique_lock<std::mutex> lock(
m_mutex);
338 bool finishedWaiting =
340 std::chrono::nanoseconds(ns),
343 return finishedWaiting;
366 uint64_t correction = (uint64_t)drift;
367 if (correction <= nsDelay)
369 return nsDelay - correction;
381 auto now = std::chrono::system_clock::now().time_since_epoch();
382 return std::chrono::duration_cast<std::chrono::nanoseconds>(now).count();
Base class used for synchronizing the simulation events to some real time "wall clock....
uint64_t m_realtimeOriginNano
The real time, in ns, when SetOrigin was called.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
uint64_t GetNormalizedRealtime()
Get the current normalized real time, in ns.
int64_t DoGetDrift(uint64_t ns) override
Get the drift between the real time clock used to synchronize the simulation and the current simulati...
bool SleepWait(uint64_t ns)
Put our process to sleep for some number of nanoseconds.
void DoEventStart() override
Record the normalized real time at which the current event is starting execution.
bool DoSynchronize(uint64_t nsCurrent, uint64_t nsDelay) override
Wait until the real time is in sync with the specified simulation time.
void DoSetOrigin(uint64_t ns) override
Establish a correspondence between a simulation time and a wall-clock (real) time.
uint64_t m_jiffy
Size of the system clock tick, as reported by clock_getres, in ns.
void DoSignal() override
Tell a possible simulator thread waiting in the DoSynchronize method that an event has happened which...
uint64_t DoGetCurrentRealtime() override
Retrieve the value of the origin of the underlying normalized wall clock time in Time resolution unit...
static TypeId GetTypeId()
Get the registered TypeId for this class.
bool m_condition
The condition state.
void DoSetCondition(bool cond) override
Set the condition variable to tell a possible simulator thread waiting in the Synchronize method that...
uint64_t m_nsEventStart
Time recorded by DoEventStart.
bool SpinWait(uint64_t ns)
Do a busy-wait until the normalized realtime equals the argument or the condition variable becomes tr...
std::condition_variable m_conditionVariable
Condition variable for thread synchronizer.
uint64_t GetRealtime()
Get the current absolute real time (in ns since the epoch).
~WallClockSynchronizer() override
Destructor.
bool DoRealtime() override
Return true if this synchronizer is actually synchronizing to a realtime clock.
WallClockSynchronizer()
Constructor.
uint64_t DoEventEnd() override
Return the amount of real time elapsed since the last call to EventStart.
uint64_t DriftCorrect(uint64_t nsNow, uint64_t nsDelay)
Compute a correction to the nominal delay to account for realtime drift since the last DoSynchronize.
std::mutex m_mutex
Mutex controlling access to the condition variable.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
ns3::WallClockSynchronizer declaration.