From f40bedb4412922b181bf6835249db486c48d804e Mon Sep 17 00:00:00 2001 From: ltracy Date: Fri, 9 Jul 2010 13:29:12 -0700 Subject: [PATCH] Fixed valgrind errors --- examples/uan/uan-rc-example.cc | 21 +++++------ examples/uan/uan-rc-example.h | 2 +- src/devices/uan/uan-channel.cc | 42 ++++++++++++++++++---- src/devices/uan/uan-channel.h | 6 ++++ src/devices/uan/uan-mac-aloha.cc | 20 +++++++++-- src/devices/uan/uan-mac-aloha.h | 2 ++ src/devices/uan/uan-mac-cw.cc | 22 ++++++++++-- src/devices/uan/uan-mac-cw.h | 3 ++ src/devices/uan/uan-mac-rc-gw.cc | 21 +++++++++-- src/devices/uan/uan-mac-rc-gw.h | 3 ++ src/devices/uan/uan-mac-rc.cc | 23 +++++++++--- src/devices/uan/uan-mac-rc.h | 3 ++ src/devices/uan/uan-mac.h | 5 +++ src/devices/uan/uan-net-device.cc | 40 +++++++++++++++++---- src/devices/uan/uan-net-device.h | 8 +++++ src/devices/uan/uan-noise-model.h | 6 ++++ src/devices/uan/uan-phy-dual.cc | 17 +++++++-- src/devices/uan/uan-phy-dual.h | 1 + src/devices/uan/uan-phy-gen.cc | 54 +++++++++++++++++++++++----- src/devices/uan/uan-phy-gen.h | 3 ++ src/devices/uan/uan-phy.cc | 49 +++++++++++++++++++++++++ src/devices/uan/uan-phy.h | 19 ++++++++++ src/devices/uan/uan-prop-model.cc | 12 +++++++ src/devices/uan/uan-prop-model.h | 6 ++++ src/devices/uan/uan-transducer-hd.cc | 28 ++++++++++++--- src/devices/uan/uan-transducer-hd.h | 2 ++ src/devices/uan/uan-transducer.h | 5 +++ src/devices/uan/wscript | 4 ++- 28 files changed, 375 insertions(+), 52 deletions(-) create mode 100644 src/devices/uan/uan-phy.cc diff --git a/examples/uan/uan-rc-example.cc b/examples/uan/uan-rc-example.cc index 8276cb1f0..697f25a93 100644 --- a/examples/uan/uan-rc-example.cc +++ b/examples/uan/uan-rc-example.cc @@ -147,9 +147,11 @@ Experiment::CreateDualModes (uint32_t fc) } uint32_t -Experiment::Run (UanHelper &uan, uint32_t param) +Experiment::Run (uint32_t param) { + UanHelper uan; + m_bytesTotal=0; uint32_t nNodes; @@ -166,6 +168,10 @@ Experiment::Run (UanHelper &uan, uint32_t param) } Time pDelay = Seconds((double) m_maxRange / 1500.0); + uan.SetPhy ("ns3::UanPhyDual", + "SupportedModesPhy1", UanModesListValue (m_dataModes), + "SupportedModesPhy2", UanModesListValue (m_controlModes)); + uan.SetMac ("ns3::UanMacRcGw", "NumberOfRates", UintegerValue (m_numRates), "NumberOfNodes", UintegerValue (nNodes), @@ -241,12 +247,6 @@ Experiment::Run (UanHelper &uan, uint32_t param) sinkSocket->SetRecvCallback (MakeCallback (&Experiment::ReceivePacket, this)); Simulator::Stop (m_simTime + Seconds(0.6)); - - chan = 0; - sinkNode = 0; - sinkSocket = 0; - pos = 0; - Simulator::Run (); Simulator::Destroy (); @@ -279,15 +279,12 @@ main(int argc, char *argv[]) exp.CreateDualModes (12000); - UanHelper uan; - uan.SetPhy ("ns3::UanPhyDual", - "SupportedModesPhy1", UanModesListValue (exp.m_dataModes), - "SupportedModesPhy2", UanModesListValue (exp.m_controlModes)); +; Gnuplot2dDataset ds; for (uint32_t param=exp.m_simMin; param<=exp.m_simMax; param += exp.m_simStep) { - uint32_t bytesRx = exp.Run (uan, param); + uint32_t bytesRx = exp.Run (param); NS_LOG_DEBUG ("param=" << param << ": Received " << bytesRx << " bytes at sink"); double util = bytesRx*8.0/(exp.m_simTime.GetSeconds ()*exp.m_totalRate); diff --git a/examples/uan/uan-rc-example.h b/examples/uan/uan-rc-example.h index 947e93b89..ba2616e8e 100644 --- a/examples/uan/uan-rc-example.h +++ b/examples/uan/uan-rc-example.h @@ -57,7 +57,7 @@ public: bool upperblock, std::string name); void CreateDualModes (uint32_t fc); - uint32_t Run (UanHelper &uan, uint32_t param); + uint32_t Run (uint32_t param); Experiment(); diff --git a/src/devices/uan/uan-channel.cc b/src/devices/uan/uan-channel.cc index b0fc35cc6..8e3638aad 100644 --- a/src/devices/uan/uan-channel.cc +++ b/src/devices/uan/uan-channel.cc @@ -65,25 +65,55 @@ UanChannel::GetTypeId () UanChannel::UanChannel () : Channel (), - m_prop (0) + m_prop (0), + m_cleared (false) { } UanChannel::~UanChannel () { } + void -UanChannel::DoDispose () +UanChannel::Clear () { + if (m_cleared) + { + return; + } + m_cleared = true; UanDeviceList::iterator it = m_devList.begin (); for (; it != m_devList.end (); it++) { - it->first = 0; - it->second = 0; + if (it->first) + { + it->first->Clear (); + it->first = 0; + } + if (it->second) + { + it->second->Clear (); + it->second = 0; + } } m_devList.clear (); - m_prop = 0; - m_noise = 0; + if (m_prop) + { + m_prop->Clear (); + m_prop = 0; + } + if (m_noise) + { + m_noise->Clear (); + m_noise = 0; + } + +} + +void +UanChannel::DoDispose () +{ + Clear (); Channel::DoDispose (); } void diff --git a/src/devices/uan/uan-channel.h b/src/devices/uan/uan-channel.h index 8f44d1de6..948961f75 100644 --- a/src/devices/uan/uan-channel.h +++ b/src/devices/uan/uan-channel.h @@ -94,10 +94,16 @@ public: */ double GetNoiseDbHz (double fKhz); + /** + * Clears all pointer references + */ + void Clear (void); + private: UanDeviceList m_devList; Ptr m_prop; Ptr m_noise; + bool m_cleared; void SendUp (uint32_t i, Ptr packet, double rxPowerDb, UanTxMode txMode, UanPdp pdp); protected: diff --git a/src/devices/uan/uan-mac-aloha.cc b/src/devices/uan/uan-mac-aloha.cc index 6ef1d7ead..0e6cd476f 100644 --- a/src/devices/uan/uan-mac-aloha.cc +++ b/src/devices/uan/uan-mac-aloha.cc @@ -35,7 +35,8 @@ namespace ns3 NS_OBJECT_ENSURE_REGISTERED (UanMacAloha); UanMacAloha::UanMacAloha () - : UanMac () + : UanMac (), + m_cleared (false) { } @@ -43,10 +44,25 @@ UanMacAloha::~UanMacAloha () { } +void +UanMacAloha::Clear () +{ + if (m_cleared) + { + return; + } + m_cleared = true; + if (m_phy) + { + m_phy->Clear (); + m_phy = 0; + } +} + void UanMacAloha::DoDispose () { - m_phy = 0; + Clear (); UanMac::DoDispose (); } diff --git a/src/devices/uan/uan-mac-aloha.h b/src/devices/uan/uan-mac-aloha.h index 35cbe6323..2c586f408 100644 --- a/src/devices/uan/uan-mac-aloha.h +++ b/src/devices/uan/uan-mac-aloha.h @@ -54,11 +54,13 @@ public: virtual void SetForwardUpCb (Callback, const UanAddress& > cb); virtual void AttachPhy (Ptr phy); virtual Address GetBroadcast (void) const; + virtual void Clear (void); private: UanAddress m_address; Ptr m_phy; Callback, const UanAddress& > m_forUpCb; + bool m_cleared; /** * \brief Receive packet from lower layer (passed to PHY as callback) diff --git a/src/devices/uan/uan-mac-cw.cc b/src/devices/uan/uan-mac-cw.cc index 99e331291..6d4e9b549 100644 --- a/src/devices/uan/uan-mac-cw.cc +++ b/src/devices/uan/uan-mac-cw.cc @@ -38,7 +38,8 @@ UanMacCw::UanMacCw () : UanMac (), m_phy (0), m_pktTx (0), - m_state (IDLE) + m_state (IDLE), + m_cleared (false) { } @@ -48,12 +49,27 @@ UanMacCw::~UanMacCw () } void -UanMacCw::DoDispose () +UanMacCw::Clear () { + if (m_cleared) + { + return; + } + m_cleared = true; m_pktTx = 0; - m_phy = 0; + if (m_phy) + { + m_phy->Clear (); + m_phy = 0; + } m_sendEvent.Cancel (); m_txEndEvent.Cancel (); +} + +void +UanMacCw::DoDispose () +{ + Clear (); UanMac::DoDispose (); } diff --git a/src/devices/uan/uan-mac-cw.h b/src/devices/uan/uan-mac-cw.h index 6b8aa0dc6..5d9acba97 100644 --- a/src/devices/uan/uan-mac-cw.h +++ b/src/devices/uan/uan-mac-cw.h @@ -72,6 +72,7 @@ public: virtual void SetForwardUpCb (Callback, const UanAddress&> cb); virtual void AttachPhy (Ptr phy); virtual Address GetBroadcast (void) const; + virtual void Clear (void); // PHY listeners /// Function called by UanPhy object to notify of packet reception @@ -111,6 +112,8 @@ private: EventId m_txEndEvent; State m_state; + bool m_cleared; + void PhyRxPacketGood (Ptr packet, double sinr, UanTxMode mode); void PhyRxPacketError (Ptr packet, double sinr); void SaveTimer (void); diff --git a/src/devices/uan/uan-mac-rc-gw.cc b/src/devices/uan/uan-mac-rc-gw.cc index 26c83177b..d886a5d07 100644 --- a/src/devices/uan/uan-mac-rc-gw.cc +++ b/src/devices/uan/uan-mac-rc-gw.cc @@ -54,7 +54,8 @@ operator < (UanAddress &a, UanAddress &b) UanMacRcGw::UanMacRcGw () : UanMac (), m_state (IDLE), - m_currentRateNum (0) + m_currentRateNum (0), + m_cleared (false) { UanHeaderCommon ch; UanHeaderRcRts rts; @@ -75,8 +76,18 @@ UanMacRcGw::~UanMacRcGw () } void -UanMacRcGw::DoDispose () +UanMacRcGw::Clear () { + if (m_cleared) + { + return; + } + m_cleared = true; + if (m_phy) + { + m_phy->Clear (); + m_phy = 0; + } m_propDelay.clear (); std::map::iterator it = m_ackData.begin (); for (; it != m_ackData.end (); it++) @@ -86,6 +97,12 @@ UanMacRcGw::DoDispose () m_ackData.clear (); m_requests.clear (); m_sortedRes.clear (); +} + +void +UanMacRcGw::DoDispose () +{ + Clear (); UanMac::DoDispose (); } TypeId diff --git a/src/devices/uan/uan-mac-rc-gw.h b/src/devices/uan/uan-mac-rc-gw.h index ab4b850bc..d3b417028 100644 --- a/src/devices/uan/uan-mac-rc-gw.h +++ b/src/devices/uan/uan-mac-rc-gw.h @@ -72,6 +72,7 @@ public: virtual void SetForwardUpCb (Callback, const UanAddress&> cb); virtual void AttachPhy (Ptr phy); virtual Address GetBroadcast (void) const; + virtual void Clear (void); private: enum State { @@ -125,6 +126,8 @@ private: std::map m_requests; std::set > m_sortedRes; + bool m_cleared; + TracedCallback, UanTxMode > m_rxLogger; // Start time, min p-delay, reservations, frames, bytes, window size, ctl rate, retry rate diff --git a/src/devices/uan/uan-mac-rc.cc b/src/devices/uan/uan-mac-rc.cc index 2607a0d33..723738b0b 100644 --- a/src/devices/uan/uan-mac-rc.cc +++ b/src/devices/uan/uan-mac-rc.cc @@ -156,7 +156,8 @@ UanMacRc::UanMacRc () m_state (UNASSOCIATED), m_rtsBlocked (false), m_currentRate (10), - m_frameNo (0) + m_frameNo (0), + m_cleared (false) { UanHeaderCommon ch; UanHeaderRcCts ctsh; @@ -171,9 +172,18 @@ UanMacRc::~UanMacRc () } void -UanMacRc::DoDispose () +UanMacRc::Clear () { - m_phy = 0; + if (m_cleared) + { + return; + } + m_cleared = true; + if (m_phy) + { + m_phy->Clear (); + m_phy = 0; + } std::list, UanAddress > >::iterator it; for (it = m_pktQueue.begin (); it != m_pktQueue.end (); it++) { @@ -183,7 +193,12 @@ UanMacRc::DoDispose () m_resList.clear (); m_startAgain.Cancel (); m_rtsEvent.Cancel (); - +} + +void +UanMacRc::DoDispose () +{ + Clear (); UanMac::DoDispose (); } diff --git a/src/devices/uan/uan-mac-rc.h b/src/devices/uan/uan-mac-rc.h index a12763c5e..0cafc6b30 100644 --- a/src/devices/uan/uan-mac-rc.h +++ b/src/devices/uan/uan-mac-rc.h @@ -151,6 +151,7 @@ public: virtual void SetForwardUpCb (Callback, const UanAddress&> cb); virtual void AttachPhy (Ptr phy); virtual Address GetBroadcast (void) const; + virtual void Clear (void); private: enum State { @@ -180,6 +181,8 @@ private: uint32_t m_ctsSizeN; uint32_t m_ctsSizeG; + bool m_cleared; + std::list, UanAddress > > m_pktQueue; std::list m_resList; diff --git a/src/devices/uan/uan-mac.h b/src/devices/uan/uan-mac.h index 62f32d0cc..d2de3051c 100644 --- a/src/devices/uan/uan-mac.h +++ b/src/devices/uan/uan-mac.h @@ -84,6 +84,11 @@ public: */ virtual Address GetBroadcast (void) const = 0; + /** + * Clears all pointer references + */ + virtual void Clear (void) = 0; + }; } diff --git a/src/devices/uan/uan-net-device.cc b/src/devices/uan/uan-net-device.cc index bf7ca9126..2319df084 100644 --- a/src/devices/uan/uan-net-device.cc +++ b/src/devices/uan/uan-net-device.cc @@ -38,7 +38,8 @@ NS_OBJECT_ENSURE_REGISTERED (UanNetDevice); UanNetDevice::UanNetDevice () : NetDevice (), - m_mtu (64000) + m_mtu (64000), + m_cleared (false) { } @@ -46,14 +47,41 @@ UanNetDevice::~UanNetDevice () { } +void +UanNetDevice::Clear () +{ + if (m_cleared) + { + return; + } + m_cleared = true; + m_node = 0; + if (m_channel) + { + m_channel->Clear (); + m_channel = 0; + } + if (m_mac) + { + m_mac->Clear (); + m_mac = 0; + } + if (m_phy) + { + m_phy->Clear (); + m_phy = 0; + } + if (m_trans) + { + m_trans->Clear (); + m_trans = 0; + } +} + void UanNetDevice::DoDispose () { - m_node = 0; - m_channel = 0; - m_mac = 0; - m_phy = 0; - m_trans = 0; + Clear (); NetDevice::DoDispose (); } diff --git a/src/devices/uan/uan-net-device.h b/src/devices/uan/uan-net-device.h index 02d2b95a3..32f288a7d 100644 --- a/src/devices/uan/uan-net-device.h +++ b/src/devices/uan/uan-net-device.h @@ -90,6 +90,11 @@ public: */ void SetTransducer (Ptr trans); + /** + * Clears all pointer references + */ + void Clear (void); + // Purely virtual functions from base class virtual void SetIfIndex (const uint32_t index); virtual uint32_t GetIfIndex (void) const; @@ -134,6 +139,9 @@ private: TracedCallback, UanAddress> m_rxLogger; TracedCallback, UanAddress> m_txLogger; + + bool m_cleared; + protected: virtual void DoDispose (); }; diff --git a/src/devices/uan/uan-noise-model.h b/src/devices/uan/uan-noise-model.h index f57982567..2d635c052 100644 --- a/src/devices/uan/uan-noise-model.h +++ b/src/devices/uan/uan-noise-model.h @@ -34,6 +34,12 @@ public: */ virtual double GetNoiseDbHz (double fKhz) const = 0; + /** + * Clears all pointer references + */ + virtual void Clear (void); + + virtual void DoDispose (void); }; } // namespace ns3 diff --git a/src/devices/uan/uan-phy-dual.cc b/src/devices/uan/uan-phy-dual.cc index ca40f660f..86f22aa97 100644 --- a/src/devices/uan/uan-phy-dual.cc +++ b/src/devices/uan/uan-phy-dual.cc @@ -131,11 +131,24 @@ UanPhyDual::~UanPhyDual () { } +void +UanPhyDual::Clear () +{ + if (m_phy1) + { + m_phy1->Clear (); + m_phy1 = 0; + } + if (m_phy2) + { + m_phy2->Clear (); + m_phy2 = 0; + } +} void UanPhyDual::DoDispose () { - m_phy1 = 0; - m_phy2 = 0; + Clear (); UanPhy::DoDispose (); } diff --git a/src/devices/uan/uan-phy-dual.h b/src/devices/uan/uan-phy-dual.h index 683518b25..7d1a8b232 100644 --- a/src/devices/uan/uan-phy-dual.h +++ b/src/devices/uan/uan-phy-dual.h @@ -114,6 +114,7 @@ public: virtual Ptr GetTransducer (void); virtual uint32_t GetNModes (void); virtual UanTxMode GetMode (uint32_t n); + virtual void Clear (void); /** * /returns True if Phy1 is Idle diff --git a/src/devices/uan/uan-phy-gen.cc b/src/devices/uan/uan-phy-gen.cc index 7cf4dc43c..9de011f20 100644 --- a/src/devices/uan/uan-phy-gen.cc +++ b/src/devices/uan/uan-phy-gen.cc @@ -352,7 +352,8 @@ UanPhyGen::UanPhyGen () m_txPwrDb (0), m_rxThreshDb (0), m_ccaThreshDb (0), - m_pktRx (0) + m_pktRx (0), + m_cleared (false) { } @@ -362,17 +363,52 @@ UanPhyGen::~UanPhyGen () } +void +UanPhyGen::Clear () +{ + if (m_cleared) + { + return; + } + m_cleared = true; + m_listeners.clear (); + if (m_channel) + { + m_channel->Clear (); + m_channel = 0; + } + if (m_transducer) + { + m_transducer->Clear (); + m_transducer = 0; + } + if (m_device) + { + m_device->Clear (); + m_device = 0; + } + if (m_mac) + { + m_mac->Clear (); + m_mac = 0; + } + if (m_per) + { + m_per->Clear (); + m_per = 0; + } + if (m_sinr) + { + m_sinr->Clear (); + m_sinr = 0; + } + m_pktRx = 0; +} + void UanPhyGen::DoDispose () { - m_listeners.clear (); - m_channel = 0; - m_transducer = 0; - m_device = 0; - m_mac = 0; - m_per = 0; - m_sinr = 0; - m_pktRx = 0; + Clear (); UanPhy::DoDispose (); } diff --git a/src/devices/uan/uan-phy-gen.h b/src/devices/uan/uan-phy-gen.h index 009daadcc..addb52571 100644 --- a/src/devices/uan/uan-phy-gen.h +++ b/src/devices/uan/uan-phy-gen.h @@ -195,6 +195,7 @@ public: virtual uint32_t GetNModes (void); virtual UanTxMode GetMode (uint32_t n); virtual Ptr GetPacketRx (void) const; + virtual void Clear (void); private: typedef std::list ListenerList; @@ -225,6 +226,8 @@ private: UanPdp m_pktRxPdp; UanTxMode m_pktRxMode; + bool m_cleared; + TracedCallback, double, UanTxMode > m_rxOkLogger; TracedCallback, double, UanTxMode > m_rxErrLogger; TracedCallback, double, UanTxMode > m_txLogger; diff --git a/src/devices/uan/uan-phy.cc b/src/devices/uan/uan-phy.cc new file mode 100644 index 000000000..3194aa284 --- /dev/null +++ b/src/devices/uan/uan-phy.cc @@ -0,0 +1,49 @@ +/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2009 University of Washington + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Leonard Tracy + */ + +#include "uan-phy.h" + +namespace ns3 { + +void +UanPhyCalcSinr::Clear () +{ +} + +void +UanPhyCalcSinr::DoDispose () +{ + Clear (); + Object::DoDispose (); +} + +void +UanPhyPer::Clear () +{ +} + +void +UanPhyPer::DoDispose () +{ + Clear (); + Object::DoDispose (); +} + +} //namespace ns3 diff --git a/src/devices/uan/uan-phy.h b/src/devices/uan/uan-phy.h index 8e6bab756..d9b883fb6 100644 --- a/src/devices/uan/uan-phy.h +++ b/src/devices/uan/uan-phy.h @@ -59,6 +59,13 @@ public: UanPdp pdp, const UanTransducer::ArrivalList &arrivalList ) const = 0; + /** + * Clears all pointer references + */ + virtual void Clear (void); + + virtual void DoDispose (void); + /** * \param db dB value * \returns kilopascals @@ -77,6 +84,7 @@ public: { return 10 * log10 (kp); } + }; /** @@ -96,6 +104,12 @@ public: * \returns Probability of packet error */ virtual double CalcPer (Ptr pkt, double sinrDb, UanTxMode mode) = 0; + /** + * Clears all pointer references + */ + virtual void Clear (void); + + virtual void DoDispose (void); }; @@ -334,6 +348,11 @@ public: * \returns Packet currently being received in PHY */ virtual Ptr GetPacketRx (void) const = 0; + + /** + * Clears all pointer references + */ + virtual void Clear (void) = 0; }; } diff --git a/src/devices/uan/uan-prop-model.cc b/src/devices/uan/uan-prop-model.cc index 2d2124a02..abfb18200 100644 --- a/src/devices/uan/uan-prop-model.cc +++ b/src/devices/uan/uan-prop-model.cc @@ -336,4 +336,16 @@ UanPdp::CreateImpulsePdp (void) return pdp; } +void +UanPropModel::Clear (void) +{ +} + +void +UanPropModel::DoDispose (void) +{ + Clear (); + Object::DoDispose (); +} + } diff --git a/src/devices/uan/uan-prop-model.h b/src/devices/uan/uan-prop-model.h index 1e5d769c3..0df33d327 100644 --- a/src/devices/uan/uan-prop-model.h +++ b/src/devices/uan/uan-prop-model.h @@ -241,6 +241,12 @@ public: */ virtual Time GetDelay (Ptr a, Ptr b, UanTxMode mode) = 0; + /** + * Clears all pointer references + */ + virtual void Clear (void); + + virtual void DoDispose (void); }; } diff --git a/src/devices/uan/uan-transducer-hd.cc b/src/devices/uan/uan-transducer-hd.cc index 52fe662cf..c08da0069 100644 --- a/src/devices/uan/uan-transducer-hd.cc +++ b/src/devices/uan/uan-transducer-hd.cc @@ -35,7 +35,8 @@ NS_OBJECT_ENSURE_REGISTERED (UanTransducerHd); UanTransducerHd::UanTransducerHd () : UanTransducer (), m_state (RX), - m_endTxTime (Seconds (0)) + m_endTxTime (Seconds (0)), + m_cleared (false) { } @@ -44,13 +45,27 @@ UanTransducerHd::~UanTransducerHd () } void -UanTransducerHd::DoDispose () +UanTransducerHd::Clear () { - m_channel = 0; + if (m_cleared) + { + return; + } + m_cleared = true; + if (m_channel) + { + m_channel->Clear (); + m_channel = 0; + } + UanPhyList::iterator it = m_phyList.begin (); for (; it != m_phyList.end (); it++) { - *it = 0; + if (*it) + { + (*it)->Clear (); + *it = 0; + } } ArrivalList::iterator ait = m_arrivalList.begin (); for (; ait != m_arrivalList.end (); ait++) @@ -60,7 +75,12 @@ UanTransducerHd::DoDispose () m_phyList.clear (); m_arrivalList.clear (); m_endTxEvent.Cancel (); +} +void +UanTransducerHd::DoDispose () +{ + Clear (); UanTransducer::DoDispose (); } TypeId diff --git a/src/devices/uan/uan-transducer-hd.h b/src/devices/uan/uan-transducer-hd.h index 7f036114f..fa676acb0 100644 --- a/src/devices/uan/uan-transducer-hd.h +++ b/src/devices/uan/uan-transducer-hd.h @@ -50,6 +50,7 @@ public: virtual Ptr GetChannel (void) const; virtual void AddPhy (Ptr); virtual const UanPhyList &GetPhyList (void) const; + virtual void Clear (void); private: State m_state; @@ -58,6 +59,7 @@ private: Ptr m_channel; EventId m_endTxEvent; Time m_endTxTime; + bool m_cleared; void RemoveArrival (UanPacketArrival arrival); void EndTx (void); diff --git a/src/devices/uan/uan-transducer.h b/src/devices/uan/uan-transducer.h index 047b7921a..984f80c48 100644 --- a/src/devices/uan/uan-transducer.h +++ b/src/devices/uan/uan-transducer.h @@ -186,6 +186,11 @@ public: * \returns List of all Phy's this transducer sends packets to. */ virtual const UanPhyList &GetPhyList (void) const = 0; + /** + * Clears all pointer references + */ + virtual void Clear (void) = 0; + }; } // namespace ns3 diff --git a/src/devices/uan/wscript b/src/devices/uan/wscript index 7c3574df8..f632da8ed 100644 --- a/src/devices/uan/wscript +++ b/src/devices/uan/wscript @@ -22,7 +22,9 @@ def build(bld): 'uan-header-rc.cc', 'uan-mac-rc.cc', 'uan-mac-rc-gw.cc', -# 'uan-test.cc' + 'uan-test.cc', + 'uan-phy.cc', + 'uan-noise-model.cc' ] headers = bld.new_task_gen('ns3header') headers.module = 'uan'