From 83abb82f0e697e413c20b2810a3a39ef529cb9be Mon Sep 17 00:00:00 2001 From: Tom Henderson Date: Mon, 25 Jan 2021 10:45:50 -0800 Subject: [PATCH] wave: (fixes #341) Resolve reference cycles --- src/wave/model/channel-manager.cc | 18 ++++++++++++------ src/wave/model/channel-manager.h | 3 +++ src/wave/model/channel-scheduler.cc | 7 +++++++ src/wave/model/channel-scheduler.h | 1 + src/wave/model/default-channel-scheduler.cc | 1 + src/wave/model/ocb-wifi-mac.cc | 7 +++++++ src/wave/model/ocb-wifi-mac.h | 2 ++ src/wave/model/wave-frame-exchange-manager.cc | 8 ++++++++ src/wave/model/wave-frame-exchange-manager.h | 4 ++++ src/wave/model/wave-net-device.cc | 13 ++----------- src/wave/model/wave-net-device.h | 3 --- 11 files changed, 47 insertions(+), 20 deletions(-) diff --git a/src/wave/model/channel-manager.cc b/src/wave/model/channel-manager.cc index cf6f4024a..5ae1e21f1 100644 --- a/src/wave/model/channel-manager.cc +++ b/src/wave/model/channel-manager.cc @@ -51,12 +51,6 @@ ChannelManager::ChannelManager () ChannelManager::~ChannelManager () { NS_LOG_FUNCTION (this); - std::map ::iterator i; - for (i = m_channels.begin (); i != m_channels.end (); ++i) - { - delete (i->second); - } - m_channels.clear (); } uint32_t @@ -175,4 +169,16 @@ ChannelManager::GetManagementPowerLevel (uint32_t channelNumber) return m_channels[channelNumber]->txPowerLevel; } +void +ChannelManager::DoDispose (void) +{ + NS_LOG_FUNCTION (this); + std::map ::iterator i; + for (i = m_channels.begin (); i != m_channels.end (); ++i) + { + delete (i->second); + } + m_channels.clear (); +} + } // namespace ns3 diff --git a/src/wave/model/channel-manager.h b/src/wave/model/channel-manager.h index 042c295e7..c9e31d01b 100644 --- a/src/wave/model/channel-manager.h +++ b/src/wave/model/channel-manager.h @@ -132,6 +132,9 @@ public: */ uint32_t GetManagementPowerLevel (uint32_t channelNumber); +protected: + virtual void DoDispose (void); + private: /// 1609.4-2010 Annex H static const uint32_t DEFAULT_OPERATING_CLASS = 17; diff --git a/src/wave/model/channel-scheduler.cc b/src/wave/model/channel-scheduler.cc index 1438d767d..96605642e 100644 --- a/src/wave/model/channel-scheduler.cc +++ b/src/wave/model/channel-scheduler.cc @@ -160,4 +160,11 @@ ChannelScheduler::StopSch (uint32_t channelNumber) return ReleaseAccess (channelNumber); } +void +ChannelScheduler::DoDispose (void) +{ + NS_LOG_FUNCTION (this); + m_device = 0; +} + } // namespace ns3 diff --git a/src/wave/model/channel-scheduler.h b/src/wave/model/channel-scheduler.h index c84e46ab2..8ca47acf1 100644 --- a/src/wave/model/channel-scheduler.h +++ b/src/wave/model/channel-scheduler.h @@ -195,6 +195,7 @@ public: protected: virtual void DoInitialize (void); + virtual void DoDispose (void); /** * \param channelNumber the specific channel diff --git a/src/wave/model/default-channel-scheduler.cc b/src/wave/model/default-channel-scheduler.cc index b7f1fc9ed..b6f3ec609 100644 --- a/src/wave/model/default-channel-scheduler.cc +++ b/src/wave/model/default-channel-scheduler.cc @@ -111,6 +111,7 @@ DefaultChannelScheduler::DoDispose (void) { m_waitEvent.Cancel (); } + m_phy = 0; ChannelScheduler::DoDispose (); } diff --git a/src/wave/model/ocb-wifi-mac.cc b/src/wave/model/ocb-wifi-mac.cc index 2a92b2c67..b21761dfd 100644 --- a/src/wave/model/ocb-wifi-mac.cc +++ b/src/wave/model/ocb-wifi-mac.cc @@ -459,4 +459,11 @@ OcbWifiMac::EnableForWave (Ptr device) StaticCast (m_feManager)->SetWaveNetDevice (device); } +void +OcbWifiMac::DoDispose (void) +{ + NS_LOG_FUNCTION (this); + RegularWifiMac::DoDispose (); +} + } // namespace ns3 diff --git a/src/wave/model/ocb-wifi-mac.h b/src/wave/model/ocb-wifi-mac.h index 34ae07972..de3f66e0a 100644 --- a/src/wave/model/ocb-wifi-mac.h +++ b/src/wave/model/ocb-wifi-mac.h @@ -175,6 +175,8 @@ public: // Inherited from base class virtual void ConfigureStandard (enum WifiStandard standard); +protected: + virtual void DoDispose (void); private: virtual void Receive (Ptr mpdu); diff --git a/src/wave/model/wave-frame-exchange-manager.cc b/src/wave/model/wave-frame-exchange-manager.cc index 18c73bb50..723a15411 100644 --- a/src/wave/model/wave-frame-exchange-manager.cc +++ b/src/wave/model/wave-frame-exchange-manager.cc @@ -163,5 +163,13 @@ WaveFrameExchangeManager::StartTransmission (Ptr dcf) return false; } +void +WaveFrameExchangeManager::DoDispose (void) +{ + NS_LOG_FUNCTION (this); + m_scheduler = 0; + m_coordinator = 0; + FrameExchangeManager::DoDispose (); +} } //namespace ns3 diff --git a/src/wave/model/wave-frame-exchange-manager.h b/src/wave/model/wave-frame-exchange-manager.h index ab7811c96..7931350db 100644 --- a/src/wave/model/wave-frame-exchange-manager.h +++ b/src/wave/model/wave-frame-exchange-manager.h @@ -63,6 +63,10 @@ public: */ void SetWaveNetDevice (Ptr device); +protected: + // Overridden from FrameExchangeManager + virtual void DoDispose (void); + private: /** * Return a TXVECTOR for the DATA frame given the destination. diff --git a/src/wave/model/wave-net-device.cc b/src/wave/model/wave-net-device.cc index ceddc9d43..6cbb23714 100644 --- a/src/wave/model/wave-net-device.cc +++ b/src/wave/model/wave-net-device.cc @@ -117,6 +117,7 @@ WaveNetDevice::DoDispose (void) mac->Dispose (); } m_macEntities.clear (); + m_phyEntities.clear (); m_channelCoordinator->Dispose (); m_channelManager->Dispose (); m_channelScheduler->Dispose (); @@ -126,7 +127,7 @@ WaveNetDevice::DoDispose (void) m_channelScheduler = 0; m_vsaManager = 0; // chain up. - NetDevice::DoDispose (); + WifiNetDevice::DoDispose (); } void @@ -635,16 +636,6 @@ WaveNetDevice::Send (Ptr packet, const Address& dest, uint16_t protocol) return true; } -Ptr -WaveNetDevice::GetNode (void) const -{ - return m_node; -} -void -WaveNetDevice::SetNode (Ptr node) -{ - m_node = node; -} bool WaveNetDevice::NeedsArp (void) const { diff --git a/src/wave/model/wave-net-device.h b/src/wave/model/wave-net-device.h index 55ad47e21..8073712a8 100644 --- a/src/wave/model/wave-net-device.h +++ b/src/wave/model/wave-net-device.h @@ -343,8 +343,6 @@ public: virtual Address GetMulticast (Ipv4Address multicastGroup) const; virtual bool IsPointToPoint (void) const; virtual bool IsBridge (void) const; - virtual Ptr GetNode (void) const; - virtual void SetNode (Ptr node); virtual bool NeedsArp (void) const; virtual void SetReceiveCallback (NetDevice::ReceiveCallback cb); virtual Address GetMulticast (Ipv6Address addr) const; @@ -401,7 +399,6 @@ private: TracedCallback m_addressChange; // copy from WifiNetDevice - Ptr m_node; ///< the node NetDevice::ReceiveCallback m_forwardUp; ///< forward up receive callback NetDevice::PromiscReceiveCallback m_promiscRx; ///< promiscious receive callback uint32_t m_ifIndex; ///< IF index