wifi: Use shared pointers to pass PhyListeners to WifiPhyStateHelper via WifiPhy
This commit is contained in:
committed by
Stefano Avallone
parent
28feec2d63
commit
7165cf22af
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>();
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user