diff --git a/src/core/model/default-simulator-impl.cc b/src/core/model/default-simulator-impl.cc index fc52be3b1..7c606ee3a 100644 --- a/src/core/model/default-simulator-impl.cc +++ b/src/core/model/default-simulator-impl.cc @@ -71,6 +71,7 @@ DefaultSimulatorImpl::DefaultSimulatorImpl () m_currentTs = 0; m_currentContext = Simulator::NO_CONTEXT; m_unscheduledEvents = 0; + m_eventCount = 0; m_eventsWithContextEmpty = true; m_main = SystemThread::Self(); } @@ -141,6 +142,7 @@ DefaultSimulatorImpl::ProcessOneEvent (void) NS_ASSERT (next.key.m_ts >= m_currentTs); m_unscheduledEvents--; + m_eventCount++; NS_LOG_LOGIC ("handle " << next.key.m_ts); m_currentTs = next.key.m_ts; @@ -411,4 +413,10 @@ DefaultSimulatorImpl::GetContext (void) const return m_currentContext; } +uint64_t +DefaultSimulatorImpl::GetEventCount (void) const +{ + return m_eventCount; +} + } // namespace ns3 diff --git a/src/core/model/default-simulator-impl.h b/src/core/model/default-simulator-impl.h index aaac4e231..51aca96e9 100644 --- a/src/core/model/default-simulator-impl.h +++ b/src/core/model/default-simulator-impl.h @@ -77,6 +77,7 @@ public: virtual void SetScheduler (ObjectFactory schedulerFactory); virtual uint32_t GetSystemId (void) const; virtual uint32_t GetContext (void) const; + virtual uint64_t GetEventCount (void) const;; private: virtual void DoDispose (void); @@ -124,6 +125,8 @@ private: uint64_t m_currentTs; /** Execution context of the current event. */ uint32_t m_currentContext; + /** The event count. */ + uint64_t m_eventCount; /** * Number of events that have been inserted but not yet scheduled, * not counting the Destroy events; this is used for validation diff --git a/src/core/model/realtime-simulator-impl.cc b/src/core/model/realtime-simulator-impl.cc index ffd9d18e9..b44c7a652 100644 --- a/src/core/model/realtime-simulator-impl.cc +++ b/src/core/model/realtime-simulator-impl.cc @@ -90,6 +90,7 @@ RealtimeSimulatorImpl::RealtimeSimulatorImpl () m_currentTs = 0; m_currentContext = Simulator::NO_CONTEXT; m_unscheduledEvents = 0; + m_eventCount = 0; m_main = SystemThread::Self(); @@ -330,6 +331,7 @@ RealtimeSimulatorImpl::ProcessOneEvent (void) "RealtimeSimulatorImpl::ProcessOneEvent(): event queue is empty"); next = m_events->RemoveNext (); m_unscheduledEvents--; + m_eventCount++; // // We cannot make any assumption that "next" is the same event we originally waited @@ -817,6 +819,12 @@ RealtimeSimulatorImpl::GetContext (void) const return m_currentContext; } +uint64_t +RealTimeSimulatorImpl::GetEventCount (void) const +{ + return m_eventCount; +} + void RealtimeSimulatorImpl::SetSynchronizationMode (enum SynchronizationMode mode) { diff --git a/src/core/model/realtime-simulator-impl.h b/src/core/model/realtime-simulator-impl.h index 5eb5eddc5..d1edf7404 100644 --- a/src/core/model/realtime-simulator-impl.h +++ b/src/core/model/realtime-simulator-impl.h @@ -107,6 +107,7 @@ public: virtual void SetScheduler (ObjectFactory schedulerFactory); virtual uint32_t GetSystemId (void) const; virtual uint32_t GetContext (void) const; + virtual uint64_t GetEventCount (void) const;; /** \copydoc ScheduleWithContext(uint32_t,const Time&,EventImpl*) */ void ScheduleRealtimeWithContext (uint32_t context, const Time &delay, EventImpl *event); @@ -202,6 +203,8 @@ private: uint64_t m_currentTs; /**< Execution context. */ uint32_t m_currentContext; + /** The event count. */ + uint64_t m_eventCount; /**@}*/ /** Mutex to control access to key state. */ diff --git a/src/core/model/simulator-impl.h b/src/core/model/simulator-impl.h index 0683afbbf..6381d8439 100644 --- a/src/core/model/simulator-impl.h +++ b/src/core/model/simulator-impl.h @@ -99,6 +99,9 @@ public: virtual uint32_t GetSystemId () const = 0; /** \copydoc Simulator::GetContext */ virtual uint32_t GetContext (void) const = 0; + /** \copydoc Simulator::GetEventCount */ + virtual uint64_t GetEventCount (void) const = 0; + }; } // namespace ns3 diff --git a/src/core/model/simulator.cc b/src/core/model/simulator.cc index 091eaafd9..edd1fb319 100644 --- a/src/core/model/simulator.cc +++ b/src/core/model/simulator.cc @@ -323,6 +323,12 @@ Simulator::GetContext (void) { return GetImpl ()->GetContext (); } + +uint64_t +Simulator::GetEventCount (void) +{ + return GetImpl ()-> GetEventCount (); +} uint32_t Simulator::GetSystemId (void) diff --git a/src/core/model/simulator.h b/src/core/model/simulator.h index 6d6a3b975..23ea07e37 100644 --- a/src/core/model/simulator.h +++ b/src/core/model/simulator.h @@ -197,7 +197,14 @@ public: */ NO_CONTEXT = 0xffffffff }; + + /** + * Get the number of events executed. + * \returns The total number of events executed. + */ + static uint64_t GetEventCount (void); + /** * @name Schedule events (in the same context) to run at a future time. */ @@ -1347,7 +1354,8 @@ private: * @return The EventId. */ static EventId DoScheduleDestroy (EventImpl *event); -}; + +}; // class Simulator /** * @ingroup simulator diff --git a/src/mpi/model/distributed-simulator-impl.cc b/src/mpi/model/distributed-simulator-impl.cc index ed842a0e7..65914c2be 100644 --- a/src/mpi/model/distributed-simulator-impl.cc +++ b/src/mpi/model/distributed-simulator-impl.cc @@ -105,6 +105,7 @@ DistributedSimulatorImpl::DistributedSimulatorImpl () NS_FATAL_ERROR ("Can't use distributed simulator without MPI compiled in"); #endif + m_eventCount = 0; m_stop = false; m_globalFinished = false; // uids are allocated from 4. @@ -117,6 +118,7 @@ DistributedSimulatorImpl::DistributedSimulatorImpl () m_currentTs = 0; m_currentContext = Simulator::NO_CONTEXT; m_unscheduledEvents = 0; + m_eventCount = 0; m_events = 0; } @@ -322,6 +324,7 @@ DistributedSimulatorImpl::ProcessOneEvent (void) NS_ASSERT (next.key.m_ts >= m_currentTs); m_unscheduledEvents--; + m_eventCount++; NS_LOG_LOGIC ("handle " << next.key.m_ts); m_currentTs = next.key.m_ts; @@ -644,4 +647,10 @@ DistributedSimulatorImpl::GetContext (void) const return m_currentContext; } +uint64_t +DistributedSimulatorImpl::GetEventCount (void) const +{ + return m_eventCount; +} + } // namespace ns3 diff --git a/src/mpi/model/distributed-simulator-impl.h b/src/mpi/model/distributed-simulator-impl.h index d76fc9ffe..1031a15e0 100644 --- a/src/mpi/model/distributed-simulator-impl.h +++ b/src/mpi/model/distributed-simulator-impl.h @@ -126,6 +126,7 @@ public: virtual void SetScheduler (ObjectFactory schedulerFactory); virtual uint32_t GetSystemId (void) const; virtual uint32_t GetContext (void) const; + virtual uint64_t GetEventCount (void) const;; private: virtual void DoDispose (void); @@ -145,6 +146,8 @@ private: uint32_t m_currentUid; uint64_t m_currentTs; uint32_t m_currentContext; + /** The event count. */ + uint64_t m_eventCount; // number of events that have been inserted but not yet scheduled, // not counting the "destroy" events; this is used for validation int m_unscheduledEvents; diff --git a/src/mpi/model/null-message-simulator-impl.cc b/src/mpi/model/null-message-simulator-impl.cc index a9163c7ba..e0e7a7b06 100644 --- a/src/mpi/model/null-message-simulator-impl.cc +++ b/src/mpi/model/null-message-simulator-impl.cc @@ -84,6 +84,7 @@ NullMessageSimulatorImpl::NullMessageSimulatorImpl () m_currentTs = 0; m_currentContext = Simulator::NO_CONTEXT; m_unscheduledEvents = 0; + m_eventCount = 0; m_events = 0; m_safeTime = Seconds (0); @@ -235,6 +236,7 @@ NullMessageSimulatorImpl::ProcessOneEvent (void) NS_ASSERT (next.key.m_ts >= m_currentTs); m_unscheduledEvents--; + m_eventCount++; NS_LOG_LOGIC ("handle " << next.key.m_ts); m_currentTs = next.key.m_ts; @@ -575,6 +577,12 @@ NullMessageSimulatorImpl::GetContext (void) const return m_currentContext; } +uint64_t +NullMessageSimulatorImpl::GetEventCount (void) const +{ + return m_eventCount; +} + Time NullMessageSimulatorImpl::CalculateGuaranteeTime (uint32_t nodeSysId) { Ptr bundle = RemoteChannelBundleManager::Find (nodeSysId); diff --git a/src/mpi/model/null-message-simulator-impl.h b/src/mpi/model/null-message-simulator-impl.h index c1eb32bfe..55c02c983 100644 --- a/src/mpi/model/null-message-simulator-impl.h +++ b/src/mpi/model/null-message-simulator-impl.h @@ -71,6 +71,7 @@ public: virtual void SetScheduler (ObjectFactory schedulerFactory); virtual uint32_t GetSystemId (void) const; virtual uint32_t GetContext (void) const; + virtual uint64_t GetEventCount (void) const;; /** * \return singleton instance @@ -176,6 +177,8 @@ private: uint32_t m_currentUid; uint64_t m_currentTs; uint32_t m_currentContext; + /** The event count. */ + uint64_t m_eventCount; // number of events that have been inserted but not yet scheduled, // not counting the "destroy" events; this is used for validation int m_unscheduledEvents; diff --git a/src/visualizer/model/visual-simulator-impl.cc b/src/visualizer/model/visual-simulator-impl.cc index 2748d7189..58225a5b3 100644 --- a/src/visualizer/model/visual-simulator-impl.cc +++ b/src/visualizer/model/visual-simulator-impl.cc @@ -216,6 +216,12 @@ VisualSimulatorImpl::GetContext (void) const return m_simulator->GetContext (); } +uint64_t +VisualSimulatorImpl::GetEventCount (void) const +{ + return m_simulator->GetEventCount (); +} + void VisualSimulatorImpl::RunRealSimulator (void) { diff --git a/src/visualizer/model/visual-simulator-impl.h b/src/visualizer/model/visual-simulator-impl.h index d27321a17..a8adf8ab8 100644 --- a/src/visualizer/model/visual-simulator-impl.h +++ b/src/visualizer/model/visual-simulator-impl.h @@ -71,6 +71,7 @@ public: virtual void SetScheduler (ObjectFactory schedulerFactory); virtual uint32_t GetSystemId (void) const; virtual uint32_t GetContext (void) const; + virtual uint64_t GetEventCount (void) const;; /// calls Run() in the wrapped simulator void RunRealSimulator (void);