wifi: Use shared pointers to pass PhyListeners to WifiPhyStateHelper via WifiPhy

This commit is contained in:
Stefano Avallone
2023-09-08 12:30:48 +02:00
committed by Stefano Avallone
parent 28feec2d63
commit 7165cf22af
11 changed files with 32 additions and 33 deletions

View File

@@ -212,12 +212,12 @@ ChannelAccessManager::DoDispose()
m_phyListeners.clear();
}
PhyListener*
std::shared_ptr<PhyListener>
ChannelAccessManager::GetPhyListener(Ptr<WifiPhy> 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<WifiPhy> 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<WifiPhy> phy)
}
else
{
phyListener = new PhyListener(this);
phyListener = std::make_shared<PhyListener>(this);
m_phyListeners.emplace(phy, phyListener);
phy->RegisterListener(phyListener);
}

View File

@@ -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<WifiPhy> phy) const;
std::shared_ptr<PhyListener> GetPhyListener(Ptr<WifiPhy> 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<Ptr<WifiPhy>, EmlsrLinkSwitchInfo> m_switchingEmlsrLinks;
/// Maps each PHY listener to the associated PHY
using PhyListenerMap = std::unordered_map<Ptr<WifiPhy>, std::unique_ptr<PhyListener>>;
using PhyListenerMap = std::unordered_map<Ptr<WifiPhy>, std::shared_ptr<PhyListener>>;
PhyListenerMap m_phyListeners; //!< the PHY listeners
Ptr<WifiPhy> m_phy; //!< pointer to the unique active PHY

View File

@@ -95,15 +95,15 @@ WifiPhyStateHelper::SetReceiveErrorCallback(RxErrorCallback callback)
}
void
WifiPhyStateHelper::RegisterListener(WifiPhyListener* listener)
WifiPhyStateHelper::RegisterListener(const std::shared_ptr<WifiPhyListener>& listener)
{
m_listeners.push_back(listener);
m_listeners.push_back(listener.get());
}
void
WifiPhyStateHelper::UnregisterListener(WifiPhyListener* listener)
WifiPhyStateHelper::UnregisterListener(const std::shared_ptr<WifiPhyListener>& 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);

View File

@@ -29,6 +29,7 @@
#include "ns3/object.h"
#include "ns3/traced-callback.h"
#include <memory>
#include <vector>
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<WifiPhyListener>& listener);
/**
* Remove WifiPhyListener from this WifiPhyStateHelper.
*
* \param listener the WifiPhyListener to unregister
*/
void UnregisterListener(WifiPhyListener* listener);
void UnregisterListener(const std::shared_ptr<WifiPhyListener>& listener);
/**
* Return the current state of WifiPhy.
*

View File

@@ -461,13 +461,13 @@ WifiPhy::SetReceiveErrorCallback(RxErrorCallback callback)
}
void
WifiPhy::RegisterListener(WifiPhyListener* listener)
WifiPhy::RegisterListener(const std::shared_ptr<WifiPhyListener>& listener)
{
m_state->RegisterListener(listener);
}
void
WifiPhy::UnregisterListener(WifiPhyListener* listener)
WifiPhy::UnregisterListener(const std::shared_ptr<WifiPhyListener>& listener)
{
m_state->UnregisterListener(listener);
}

View File

@@ -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<WifiPhyListener>& 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<WifiPhyListener>& listener);
/**
* \param callback the callback to invoke when PHY capabilities have changed.

View File

@@ -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<WifiRadioEnergyModelPhyListener>();
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<WifiRadioEnergyModelPhyListener>
WifiRadioEnergyModel::GetPhyListener()
{
NS_LOG_FUNCTION(this);

View File

@@ -331,7 +331,7 @@ class WifiRadioEnergyModel : public DeviceEnergyModel
/**
* \returns Pointer to the PHY listener.
*/
WifiRadioEnergyModelPhyListener* GetPhyListener();
std::shared_ptr<WifiRadioEnergyModelPhyListener> GetPhyListener();
private:
void DoDispose() override;
@@ -384,7 +384,7 @@ class WifiRadioEnergyModel : public DeviceEnergyModel
WifiRadioEnergyRechargedCallback m_energyRechargedCallback;
/// WifiPhy listener
WifiRadioEnergyModelPhyListener* m_listener;
std::shared_ptr<WifiRadioEnergyModelPhyListener> m_listener;
EventId m_switchToOffEvent; ///< switch to off event
};

View File

@@ -366,7 +366,7 @@ class SpectrumWifiPhyListenerTest : public SpectrumWifiPhyBasicTest
private:
void DoSetup() override;
void DoRun() override;
TestPhyListener* m_listener; ///< listener
std::shared_ptr<TestPhyListener> m_listener; ///< listener
};
SpectrumWifiPhyListenerTest::SpectrumWifiPhyListenerTest()
@@ -382,7 +382,7 @@ void
SpectrumWifiPhyListenerTest::DoSetup()
{
SpectrumWifiPhyBasicTest::DoSetup();
m_listener = new TestPhyListener;
m_listener = std::make_shared<TestPhyListener>();
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<Ptr<MultiModelSpectrumChannel>> m_spectrumChannels; //!< Spectrum channels
std::vector<Ptr<SpectrumWifiPhy>> m_txPhys{}; //!< TX PHYs
std::vector<Ptr<SpectrumWifiPhy>> m_rxPhys{}; //!< RX PHYs
std::vector<std::unique_ptr<TestPhyListener>> m_listeners{}; //!< listeners
std::vector<std::shared_ptr<TestPhyListener>> m_listeners{}; //!< listeners
std::vector<uint32_t> 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<TestPhyListener>();
rxPhy->RegisterListener(listener.get());
auto listener = std::make_shared<TestPhyListener>();
rxPhy->RegisterListener(listener);
m_listeners.push_back(std::move(listener));
m_rxPhys.push_back(rxPhy);

View File

@@ -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<CcaTestPhyListener>
std::shared_ptr<CcaTestPhyListener>
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<SpectrumWifiPhy>();
m_rxPhyStateListener = std::make_unique<CcaTestPhyListener>();
m_rxPhy->RegisterListener(m_rxPhyStateListener.get());
m_rxPhy->RegisterListener(m_rxPhyStateListener);
Ptr<InterferenceHelper> rxInterferenceHelper = CreateObject<InterferenceHelper>();
m_rxPhy->SetInterferenceHelper(rxInterferenceHelper);
Ptr<ErrorRateModel> rxErrorModel = CreateObject<NistErrorRateModel>();

View File

@@ -3180,7 +3180,7 @@ class TestUlOfdmaPhyTransmission : public TestCase
Ptr<OfdmaSpectrumWifiPhy> m_phySta2; ///< PHY of STA 2
Ptr<OfdmaSpectrumWifiPhy> m_phySta3; ///< PHY of STA 3
std::unique_ptr<OfdmaTestPhyListener>
std::shared_ptr<OfdmaTestPhyListener>
m_apPhyStateListener; ///< listener for AP PHY state transitions
Ptr<WaveformGenerator> m_phyInterferer; ///< PHY of interferer
@@ -3735,7 +3735,7 @@ TestUlOfdmaPhyTransmission::DoSetup()
Ptr<ConstantPositionMobilityModel> apMobility = CreateObject<ConstantPositionMobilityModel>();
m_phyAp->SetMobility(apMobility);
m_apPhyStateListener = std::make_unique<OfdmaTestPhyListener>();
m_phyAp->RegisterListener(m_apPhyStateListener.get());
m_phyAp->RegisterListener(m_apPhyStateListener);
apDev->SetPhy(m_phyAp);
apMac->SetWifiPhys({m_phyAp});
apNode->AggregateObject(apMobility);