From 7165cf22af3a8bdd87f03e5f40553c6a700bd52c Mon Sep 17 00:00:00 2001 From: Stefano Avallone Date: Fri, 8 Sep 2023 12:30:48 +0200 Subject: [PATCH] wifi: Use shared pointers to pass PhyListeners to WifiPhyStateHelper via WifiPhy --- src/wifi/model/channel-access-manager.cc | 10 ++++------ src/wifi/model/channel-access-manager.h | 4 ++-- src/wifi/model/wifi-phy-state-helper.cc | 8 ++++---- src/wifi/model/wifi-phy-state-helper.h | 5 +++-- src/wifi/model/wifi-phy.cc | 4 ++-- src/wifi/model/wifi-phy.h | 4 ++-- src/wifi/model/wifi-radio-energy-model.cc | 6 +++--- src/wifi/model/wifi-radio-energy-model.h | 4 ++-- src/wifi/test/spectrum-wifi-phy-test.cc | 12 ++++++------ src/wifi/test/wifi-phy-cca-test.cc | 4 ++-- src/wifi/test/wifi-phy-ofdma-test.cc | 4 ++-- 11 files changed, 32 insertions(+), 33 deletions(-) diff --git a/src/wifi/model/channel-access-manager.cc b/src/wifi/model/channel-access-manager.cc index da41e3938..da9ad82ec 100644 --- a/src/wifi/model/channel-access-manager.cc +++ b/src/wifi/model/channel-access-manager.cc @@ -212,12 +212,12 @@ ChannelAccessManager::DoDispose() m_phyListeners.clear(); } -PhyListener* +std::shared_ptr ChannelAccessManager::GetPhyListener(Ptr phy) const { if (auto listenerIt = m_phyListeners.find(phy); listenerIt != m_phyListeners.end()) { - return listenerIt->second.get(); + return listenerIt->second; } return nullptr; } @@ -227,9 +227,7 @@ ChannelAccessManager::SetupPhyListener(Ptr phy) { NS_LOG_FUNCTION(this << phy); - auto phyListener = GetPhyListener(phy); - - if (phyListener) + if (auto phyListener = GetPhyListener(phy)) { // a PHY listener for the given PHY already exists, it must be inactive NS_ASSERT_MSG(!phyListener->IsActive(), @@ -239,7 +237,7 @@ ChannelAccessManager::SetupPhyListener(Ptr phy) } else { - phyListener = new PhyListener(this); + phyListener = std::make_shared(this); m_phyListeners.emplace(phy, phyListener); phy->RegisterListener(phyListener); } diff --git a/src/wifi/model/channel-access-manager.h b/src/wifi/model/channel-access-manager.h index a29fc62b1..f64f89fd8 100644 --- a/src/wifi/model/channel-access-manager.h +++ b/src/wifi/model/channel-access-manager.h @@ -317,7 +317,7 @@ class ChannelAccessManager : public Object * \param phy the given PHY * \return the current registered listener for PHY events on the given PHY */ - PhyListener* GetPhyListener(Ptr phy) const; + std::shared_ptr GetPhyListener(Ptr phy) const; /** * Initialize the structures holding busy end times per channel type (primary, * secondary, etc.) and per 20 MHz channel. @@ -434,7 +434,7 @@ class ChannelAccessManager : public Object std::unordered_map, EmlsrLinkSwitchInfo> m_switchingEmlsrLinks; /// Maps each PHY listener to the associated PHY - using PhyListenerMap = std::unordered_map, std::unique_ptr>; + using PhyListenerMap = std::unordered_map, std::shared_ptr>; PhyListenerMap m_phyListeners; //!< the PHY listeners Ptr m_phy; //!< pointer to the unique active PHY diff --git a/src/wifi/model/wifi-phy-state-helper.cc b/src/wifi/model/wifi-phy-state-helper.cc index 16e0ed1c9..9ecc53ceb 100644 --- a/src/wifi/model/wifi-phy-state-helper.cc +++ b/src/wifi/model/wifi-phy-state-helper.cc @@ -95,15 +95,15 @@ WifiPhyStateHelper::SetReceiveErrorCallback(RxErrorCallback callback) } void -WifiPhyStateHelper::RegisterListener(WifiPhyListener* listener) +WifiPhyStateHelper::RegisterListener(const std::shared_ptr& listener) { - m_listeners.push_back(listener); + m_listeners.push_back(listener.get()); } void -WifiPhyStateHelper::UnregisterListener(WifiPhyListener* listener) +WifiPhyStateHelper::UnregisterListener(const std::shared_ptr& listener) { - auto it = find(m_listeners.begin(), m_listeners.end(), listener); + auto it = find(m_listeners.begin(), m_listeners.end(), listener.get()); if (it != m_listeners.end()) { m_listeners.erase(it); diff --git a/src/wifi/model/wifi-phy-state-helper.h b/src/wifi/model/wifi-phy-state-helper.h index 769fd3138..d6b9f9dab 100644 --- a/src/wifi/model/wifi-phy-state-helper.h +++ b/src/wifi/model/wifi-phy-state-helper.h @@ -29,6 +29,7 @@ #include "ns3/object.h" #include "ns3/traced-callback.h" +#include #include namespace ns3 @@ -93,13 +94,13 @@ class WifiPhyStateHelper : public Object * * \param listener the WifiPhyListener to register */ - void RegisterListener(WifiPhyListener* listener); + void RegisterListener(const std::shared_ptr& listener); /** * Remove WifiPhyListener from this WifiPhyStateHelper. * * \param listener the WifiPhyListener to unregister */ - void UnregisterListener(WifiPhyListener* listener); + void UnregisterListener(const std::shared_ptr& listener); /** * Return the current state of WifiPhy. * diff --git a/src/wifi/model/wifi-phy.cc b/src/wifi/model/wifi-phy.cc index 8523787b7..7ec7309b4 100644 --- a/src/wifi/model/wifi-phy.cc +++ b/src/wifi/model/wifi-phy.cc @@ -461,13 +461,13 @@ WifiPhy::SetReceiveErrorCallback(RxErrorCallback callback) } void -WifiPhy::RegisterListener(WifiPhyListener* listener) +WifiPhy::RegisterListener(const std::shared_ptr& listener) { m_state->RegisterListener(listener); } void -WifiPhy::UnregisterListener(WifiPhyListener* listener) +WifiPhy::UnregisterListener(const std::shared_ptr& listener) { m_state->UnregisterListener(listener); } diff --git a/src/wifi/model/wifi-phy.h b/src/wifi/model/wifi-phy.h index e2b12aded..4c2b2c94b 100644 --- a/src/wifi/model/wifi-phy.h +++ b/src/wifi/model/wifi-phy.h @@ -86,14 +86,14 @@ class WifiPhy : public Object * Add the input listener to the list of objects to be notified of * PHY-level events. */ - void RegisterListener(WifiPhyListener* listener); + void RegisterListener(const std::shared_ptr& listener); /** * \param listener the listener to be unregistered * * Remove the input listener from the list of objects to be notified of * PHY-level events. */ - void UnregisterListener(WifiPhyListener* listener); + void UnregisterListener(const std::shared_ptr& listener); /** * \param callback the callback to invoke when PHY capabilities have changed. diff --git a/src/wifi/model/wifi-radio-energy-model.cc b/src/wifi/model/wifi-radio-energy-model.cc index efa4b5790..72a1a6a68 100644 --- a/src/wifi/model/wifi-radio-energy-model.cc +++ b/src/wifi/model/wifi-radio-energy-model.cc @@ -99,7 +99,7 @@ WifiRadioEnergyModel::WifiRadioEnergyModel() NS_LOG_FUNCTION(this); m_energyDepletionCallback.Nullify(); // set callback for WifiPhy listener - m_listener = new WifiRadioEnergyModelPhyListener; + m_listener = std::make_shared(); m_listener->SetChangeStateCallback(MakeCallback(&DeviceEnergyModel::ChangeState, this)); // set callback for updating the TX current m_listener->SetUpdateTxCurrentCallback( @@ -110,7 +110,7 @@ WifiRadioEnergyModel::~WifiRadioEnergyModel() { NS_LOG_FUNCTION(this); m_txCurrentModel = nullptr; - delete m_listener; + m_listener.reset(); } void @@ -387,7 +387,7 @@ WifiRadioEnergyModel::HandleEnergyChanged() } } -WifiRadioEnergyModelPhyListener* +std::shared_ptr WifiRadioEnergyModel::GetPhyListener() { NS_LOG_FUNCTION(this); diff --git a/src/wifi/model/wifi-radio-energy-model.h b/src/wifi/model/wifi-radio-energy-model.h index 61a3b18fe..cb876663c 100644 --- a/src/wifi/model/wifi-radio-energy-model.h +++ b/src/wifi/model/wifi-radio-energy-model.h @@ -331,7 +331,7 @@ class WifiRadioEnergyModel : public DeviceEnergyModel /** * \returns Pointer to the PHY listener. */ - WifiRadioEnergyModelPhyListener* GetPhyListener(); + std::shared_ptr GetPhyListener(); private: void DoDispose() override; @@ -384,7 +384,7 @@ class WifiRadioEnergyModel : public DeviceEnergyModel WifiRadioEnergyRechargedCallback m_energyRechargedCallback; /// WifiPhy listener - WifiRadioEnergyModelPhyListener* m_listener; + std::shared_ptr m_listener; EventId m_switchToOffEvent; ///< switch to off event }; diff --git a/src/wifi/test/spectrum-wifi-phy-test.cc b/src/wifi/test/spectrum-wifi-phy-test.cc index 52d5bf89e..e99bdea7c 100644 --- a/src/wifi/test/spectrum-wifi-phy-test.cc +++ b/src/wifi/test/spectrum-wifi-phy-test.cc @@ -366,7 +366,7 @@ class SpectrumWifiPhyListenerTest : public SpectrumWifiPhyBasicTest private: void DoSetup() override; void DoRun() override; - TestPhyListener* m_listener; ///< listener + std::shared_ptr m_listener; ///< listener }; SpectrumWifiPhyListenerTest::SpectrumWifiPhyListenerTest() @@ -382,7 +382,7 @@ void SpectrumWifiPhyListenerTest::DoSetup() { SpectrumWifiPhyBasicTest::DoSetup(); - m_listener = new TestPhyListener; + m_listener = std::make_shared(); m_phy->RegisterListener(m_listener); } @@ -403,7 +403,7 @@ SpectrumWifiPhyListenerTest::DoRun() NS_TEST_ASSERT_MSG_EQ(m_listener->m_notifyRxEndOk, 1, "Didn't receive NotifyRxEnd"); Simulator::Destroy(); - delete m_listener; + m_listener.reset(); } /** @@ -893,7 +893,7 @@ class SpectrumWifiPhyMultipleInterfacesTest : public TestCase std::vector> m_spectrumChannels; //!< Spectrum channels std::vector> m_txPhys{}; //!< TX PHYs std::vector> m_rxPhys{}; //!< RX PHYs - std::vector> m_listeners{}; //!< listeners + std::vector> m_listeners{}; //!< listeners std::vector m_counts{0}; //!< count number of packets received by PHYs @@ -1156,8 +1156,8 @@ SpectrumWifiPhyMultipleInterfacesTest::DoSetup() "PhyRxBegin", MakeCallback(&SpectrumWifiPhyMultipleInterfacesTest::RxCallback, this).Bind(index)); - auto listener = std::make_unique(); - rxPhy->RegisterListener(listener.get()); + auto listener = std::make_shared(); + rxPhy->RegisterListener(listener); m_listeners.push_back(std::move(listener)); m_rxPhys.push_back(rxPhy); diff --git a/src/wifi/test/wifi-phy-cca-test.cc b/src/wifi/test/wifi-phy-cca-test.cc index 3f7ba0dbd..2b8a516a2 100644 --- a/src/wifi/test/wifi-phy-cca-test.cc +++ b/src/wifi/test/wifi-phy-cca-test.cc @@ -812,7 +812,7 @@ class WifiPhyCcaIndicationTest : public TestCase std::size_t m_numSignalGenerators; ///< The number of non-wifi signals generators needed for the test - std::unique_ptr + std::shared_ptr m_rxPhyStateListener; ///< Listener for PHY state transitions uint16_t m_frequency; ///< Operating frequency in MHz @@ -1018,7 +1018,7 @@ WifiPhyCcaIndicationTest::DoSetup() rxDev->SetVhtConfiguration(vhtConfiguration); m_rxPhy = CreateObject(); m_rxPhyStateListener = std::make_unique(); - m_rxPhy->RegisterListener(m_rxPhyStateListener.get()); + m_rxPhy->RegisterListener(m_rxPhyStateListener); Ptr rxInterferenceHelper = CreateObject(); m_rxPhy->SetInterferenceHelper(rxInterferenceHelper); Ptr rxErrorModel = CreateObject(); diff --git a/src/wifi/test/wifi-phy-ofdma-test.cc b/src/wifi/test/wifi-phy-ofdma-test.cc index 763c314ca..5757b41b3 100644 --- a/src/wifi/test/wifi-phy-ofdma-test.cc +++ b/src/wifi/test/wifi-phy-ofdma-test.cc @@ -3180,7 +3180,7 @@ class TestUlOfdmaPhyTransmission : public TestCase Ptr m_phySta2; ///< PHY of STA 2 Ptr m_phySta3; ///< PHY of STA 3 - std::unique_ptr + std::shared_ptr m_apPhyStateListener; ///< listener for AP PHY state transitions Ptr m_phyInterferer; ///< PHY of interferer @@ -3735,7 +3735,7 @@ TestUlOfdmaPhyTransmission::DoSetup() Ptr apMobility = CreateObject(); m_phyAp->SetMobility(apMobility); m_apPhyStateListener = std::make_unique(); - m_phyAp->RegisterListener(m_apPhyStateListener.get()); + m_phyAp->RegisterListener(m_apPhyStateListener); apDev->SetPhy(m_phyAp); apMac->SetWifiPhys({m_phyAp}); apNode->AggregateObject(apMobility);