From 0e11e9f7f490f267149e0e157457391877dc80d4 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Thu, 3 May 2007 12:33:08 +0200 Subject: [PATCH] make L3Demux an NsUnknown object. --- src/core/ns-unknown.cc | 29 +++++++++++++++++++++---- src/core/ns-unknown.h | 16 ++++++++++---- src/core/object.cc | 17 ++++++++++----- src/core/object.h | 5 ++++- src/node/arp.cc | 3 ++- src/node/arp.h | 4 ++-- src/node/internet-node.cc | 41 ++++++++++++++---------------------- src/node/internet-node.h | 5 ++--- src/node/ipv4-l4-protocol.cc | 6 ++++++ src/node/ipv4-l4-protocol.h | 7 +++--- src/node/ipv4.cc | 5 +++-- src/node/ipv4.h | 6 +++--- src/node/l3-demux.cc | 13 +++++++----- src/node/l3-demux.h | 9 ++++---- src/node/l3-protocol.cc | 6 ++++++ src/node/l3-protocol.h | 6 +++--- src/node/node.cc | 8 ++----- src/node/node.h | 6 ++---- src/node/udp.cc | 3 ++- src/node/udp.h | 6 +++--- 20 files changed, 121 insertions(+), 80 deletions(-) diff --git a/src/core/ns-unknown.cc b/src/core/ns-unknown.cc index f22d60586..638f78613 100644 --- a/src/core/ns-unknown.cc +++ b/src/core/ns-unknown.cc @@ -35,17 +35,20 @@ public: void RefAll (NsUnknownImpl *other); void Unref (void); void UnrefAll (void); - NsUnknown *DoQueryInterface (uint32_t iid); + NsUnknown *DoQueryInterface (uint32_t iid) const; + void DoDisposeAll (void); void AddInterface (NsUnknown *interface); void AddSelfInterface (uint32_t iid, NsUnknown *interface); private: typedef std::list > List; uint32_t m_ref; List m_list; + bool m_disposed; }; NsUnknownImpl::NsUnknownImpl (uint32_t iid, NsUnknown *interface) - : m_ref (1) + : m_ref (1), + m_disposed (false) { m_list.push_back (std::make_pair (iid, interface)); } @@ -83,8 +86,20 @@ NsUnknownImpl::UnrefAll (void) m_ref = 0; delete this; } +void +NsUnknownImpl::DoDisposeAll (void) +{ + NS_ASSERT (!m_disposed); + for (List::const_iterator i = m_list.begin (); + i != m_list.end (); i++) + { + NsUnknown *interface = i->second; + interface->DoDispose (); + } + m_disposed = true; +} NsUnknown * -NsUnknownImpl::DoQueryInterface (uint32_t iid) +NsUnknownImpl::DoQueryInterface (uint32_t iid) const { for (List::const_iterator i = m_list.begin (); i != m_list.end (); i++) @@ -138,6 +153,12 @@ NsUnknown::Unref (void) void NsUnknown::Dispose (void) +{ + m_impl->DoDisposeAll (); +} + +void +NsUnknown::DoDispose (void) { // we do not do anything by default. } @@ -160,7 +181,7 @@ NsUnknown::UnrefInternal (void) } NsUnknown * -NsUnknown::DoQueryInterface (uint32_t iid) +NsUnknown::DoQueryInterface (uint32_t iid) const { return m_impl->DoQueryInterface (iid); } diff --git a/src/core/ns-unknown.h b/src/core/ns-unknown.h index b8f84d0a9..a5490d909 100644 --- a/src/core/ns-unknown.h +++ b/src/core/ns-unknown.h @@ -47,7 +47,7 @@ public: * \param iid the NsUnknown id of the requested interface */ template - T *QueryInterface (uint32_t iid); + T *QueryInterface (uint32_t iid) const; /** * \param interface another interface @@ -59,7 +59,7 @@ public: */ void AddInterface (NsUnknown *interface); - virtual void Dispose (void); + void Dispose (void); protected: /** * \param iid the Interface Id of the interface defined by a direct subclass @@ -79,10 +79,18 @@ protected: * this method to associate an interface id to your interface. */ void AddSelfInterface (uint32_t iid, NsUnknown *interface); +protected: + /** + * Subclasses who want to handle the "dispose" event should + * override this method. They are also responsible for + * "chaining up" to their parent class' DoDispose method + * once they have done their own "dispose". + */ + virtual void DoDispose (void); private: friend class NsUnknownImpl; NsUnknown (); - NsUnknown *DoQueryInterface (uint32_t iid); + NsUnknown *DoQueryInterface (uint32_t iid) const; void RefInternal (void); void UnrefInternal (void); NsUnknownImpl *m_impl; @@ -95,7 +103,7 @@ namespace ns3 { template T * -NsUnknown::QueryInterface (uint32_t iid) +NsUnknown::QueryInterface (uint32_t iid) const { NsUnknown *found = DoQueryInterface (iid); if (found != 0) diff --git a/src/core/object.cc b/src/core/object.cc index 97a6832c7..9c7e8d83e 100644 --- a/src/core/object.cc +++ b/src/core/object.cc @@ -20,19 +20,19 @@ */ #include "object.h" #include "debug.h" +#include "assert.h" NS_DEBUG_COMPONENT_DEFINE ("Object"); namespace ns3 { Object::Object () - : m_count (1) -{ -} + : m_count (1), + m_disposed (false) +{} Object::~Object () -{ -} +{} void Object::Ref (void) const @@ -65,6 +65,13 @@ Object::IsSingle (void) const void Object::Dispose (void) +{ + NS_ASSERT (!m_disposed); + DoDispose (); +} + +void +Object::DoDispose (void) {} }//namespace ns3 diff --git a/src/core/object.h b/src/core/object.h index 1f2302001..0f03307cc 100644 --- a/src/core/object.h +++ b/src/core/object.h @@ -33,9 +33,12 @@ public: void Ref (void) const; void Unref (void) const; bool IsSingle (void) const; - virtual void Dispose (void); + void Dispose (void); +protected: + virtual void DoDispose (void); private: mutable uint32_t m_count; + bool m_disposed; }; }//namespace ns3 diff --git a/src/node/arp.cc b/src/node/arp.cc index 7f9aa1a1e..af7d7e456 100644 --- a/src/node/arp.cc +++ b/src/node/arp.cc @@ -48,7 +48,7 @@ Arp::~Arp () } void -Arp::Dispose (void) +Arp::DoDispose (void) { for (CacheList::const_iterator i = m_cacheList.begin (); i != m_cacheList.end (); i++) { @@ -60,6 +60,7 @@ Arp::Dispose (void) m_node->Unref (); m_node = 0; } + L3Protocol::DoDispose (); } TraceResolver * diff --git a/src/node/arp.h b/src/node/arp.h index cbd40e784..29d4c5498 100644 --- a/src/node/arp.h +++ b/src/node/arp.h @@ -43,14 +43,14 @@ public: Arp (Node *node); ~Arp (); - virtual void Dispose (void); - virtual TraceResolver *CreateTraceResolver (TraceContext const &context); virtual void Receive(Packet& p, NetDevice *device); bool Lookup (Packet &p, Ipv4Address destination, NetDevice *device, MacAddress *hardwareDestination); +protected: + virtual void DoDispose (void); private: typedef std::list CacheList; ArpCache *FindCache (NetDevice *device); diff --git a/src/node/internet-node.cc b/src/node/internet-node.cc index eaa5473b1..0ac0f8047 100644 --- a/src/node/internet-node.cc +++ b/src/node/internet-node.cc @@ -39,25 +39,25 @@ InternetNode::InternetNode() { // Instantiate the capabilities m_applicationList = new ApplicationList(this); - m_l3Demux = new L3Demux(this); + L3Demux *l3Demux = new L3Demux(this); + NsUnknown::AddInterface (l3Demux); m_ipv4L4Demux = new Ipv4L4Demux(this); Ipv4 *ipv4 = new Ipv4 (this); Arp *arp = new Arp (this); Udp *udp = new Udp (this); - m_l3Demux->Insert (ipv4); - m_l3Demux->Insert (arp); + l3Demux->Insert (ipv4); + l3Demux->Insert (arp); m_ipv4L4Demux->Insert (udp); + l3Demux->Unref (); ipv4->Unref (); arp->Unref (); udp->Unref (); } InternetNode::~InternetNode () -{ - Dispose (); -} +{} void InternetNode::SetName (std::string name) @@ -90,14 +90,9 @@ InternetNode::CreateTraceResolver (TraceContext const &context) return resolver; } -void InternetNode::Dispose() +void +InternetNode::DoDispose() { - if (m_l3Demux != 0) - { - m_l3Demux->Dispose (); - m_l3Demux->Unref (); - m_l3Demux = 0; - } if (m_ipv4L4Demux != 0) { m_ipv4L4Demux->Dispose (); @@ -112,8 +107,7 @@ void InternetNode::Dispose() m_applicationList = 0; } - // chain up. - Node::Dispose (); + Node::DoDispose (); } ApplicationList* @@ -123,13 +117,6 @@ InternetNode::GetApplicationList() const return m_applicationList; } -L3Demux* -InternetNode::GetL3Demux() const -{ - m_l3Demux->Ref (); - return m_l3Demux; -} - Ipv4L4Demux* InternetNode::GetIpv4L4Demux() const { @@ -140,7 +127,9 @@ InternetNode::GetIpv4L4Demux() const Ipv4 * InternetNode::GetIpv4 (void) const { - Ipv4 *ipv4 = static_cast (m_l3Demux->PeekProtocol (Ipv4::PROT_NUMBER)); + L3Demux *l3Demux = QueryInterface (L3Demux::iid); + Ipv4 *ipv4 = static_cast (l3Demux->PeekProtocol (Ipv4::PROT_NUMBER)); + l3Demux->Unref (); ipv4->Ref (); return ipv4; } @@ -155,7 +144,9 @@ InternetNode::GetUdp (void) const Arp * InternetNode::GetArp (void) const { - Arp *arp = static_cast (m_l3Demux->PeekProtocol (Arp::PROT_NUMBER)); + L3Demux *l3Demux = QueryInterface (L3Demux::iid); + Arp *arp = static_cast (l3Demux->PeekProtocol (Arp::PROT_NUMBER)); + l3Demux->Unref (); arp->Ref (); return arp; } @@ -169,7 +160,7 @@ InternetNode::DoAddDevice (NetDevice *device) const bool InternetNode::ReceiveFromDevice (NetDevice *device, const Packet &p, uint16_t protocolNumber) const { - L3Demux *demux = GetL3Demux(); + L3Demux *demux = QueryInterface (L3Demux::iid); L3Protocol *target = demux->PeekProtocol (protocolNumber); demux->Unref (); if (target != 0) diff --git a/src/node/internet-node.h b/src/node/internet-node.h index 4a4db34fc..90584cd21 100644 --- a/src/node/internet-node.h +++ b/src/node/internet-node.h @@ -44,22 +44,21 @@ public: InternetNode(); virtual ~InternetNode (); virtual TraceResolver *CreateTraceResolver (TraceContext const &context); - virtual void Dispose(); // Capability access virtual ApplicationList* GetApplicationList() const; - virtual L3Demux* GetL3Demux() const; virtual Ipv4L4Demux* GetIpv4L4Demux() const; virtual Ipv4 * GetIpv4 (void) const; virtual Udp * GetUdp (void) const; virtual Arp * GetArp (void) const; void SetName(std::string name); +protected: + virtual void DoDispose(void); private: virtual void DoAddDevice (NetDevice *device) const; bool ReceiveFromDevice (NetDevice *device, const Packet &p, uint16_t protocolNumber) const; // Capabilities ApplicationList* m_applicationList; - L3Demux* m_l3Demux; Ipv4L4Demux* m_ipv4L4Demux; std::string m_name; }; diff --git a/src/node/ipv4-l4-protocol.cc b/src/node/ipv4-l4-protocol.cc index 58a225f1b..7208fbc3c 100644 --- a/src/node/ipv4-l4-protocol.cc +++ b/src/node/ipv4-l4-protocol.cc @@ -45,4 +45,10 @@ Ipv4L4Protocol::GetVersion() const return m_version; } +void +Ipv4L4Protocol::DoDispose (void) +{ + Object::DoDispose (); +} + }//namespace ns3 diff --git a/src/node/ipv4-l4-protocol.h b/src/node/ipv4-l4-protocol.h index 782b64791..8e1b4397e 100644 --- a/src/node/ipv4-l4-protocol.h +++ b/src/node/ipv4-l4-protocol.h @@ -51,8 +51,6 @@ public: Ipv4L4Protocol(int protocolNumber, int version); virtual ~Ipv4L4Protocol (); - virtual void Dispose (void) = 0; - /** * \returns the protocol number of this protocol. */ @@ -75,8 +73,9 @@ public: virtual void Receive(Packet& p, Ipv4Address const &source, Ipv4Address const &destination) = 0; - - private: +protected: + virtual void DoDispose (void); +private: int m_protocolNumber; int m_version; }; diff --git a/src/node/ipv4.cc b/src/node/ipv4.cc index a82483039..967b5b369 100644 --- a/src/node/ipv4.cc +++ b/src/node/ipv4.cc @@ -56,11 +56,11 @@ Ipv4::Ipv4(Node *node) } Ipv4::~Ipv4 () { - Dispose (); + DoDispose (); } void -Ipv4::Dispose (void) +Ipv4::DoDispose (void) { for (Ipv4InterfaceList::iterator i = m_interfaces.begin (); i != m_interfaces.end (); i++) { @@ -89,6 +89,7 @@ Ipv4::Dispose (void) m_node->Unref (); m_node = 0; } + L3Protocol::DoDispose (); } void diff --git a/src/node/ipv4.h b/src/node/ipv4.h index 68e7f3ab4..adf6d60c6 100644 --- a/src/node/ipv4.h +++ b/src/node/ipv4.h @@ -61,8 +61,6 @@ public: Ipv4(Node *node); virtual ~Ipv4 (); - virtual void Dispose (void); - /** * \param context the trace context to use to construct the * TraceResolver to return @@ -217,7 +215,9 @@ public: void SetDown (uint32_t i); - private: +protected: + virtual void DoDispose (void); +private: void SendRealOut (Packet const &packet, Ipv4Header const &ip, Ipv4Route const &route); bool Forwarding (Packet const &packet, Ipv4Header &ipHeader, NetDevice *device); void ForwardUp (Packet p, Ipv4Header const&ip); diff --git a/src/node/l3-demux.cc b/src/node/l3-demux.cc index 630f03a64..9d49d5ff4 100644 --- a/src/node/l3-demux.cc +++ b/src/node/l3-demux.cc @@ -23,25 +23,27 @@ #include #include #include "ns3/composite-trace-resolver.h" +#include "ns3/iid-manager.h" #include "l3-demux.h" #include "l3-protocol.h" #include "node.h" namespace ns3 { +const uint32_t L3Demux::iid = IidManager::Allocate ("L3Demux"); + L3Demux::L3Demux (Node *node) - : m_node (node) + : NsUnknown (L3Demux::iid), + m_node (node) { m_node->Ref (); } L3Demux::~L3Demux() -{ - Dispose (); -} +{} void -L3Demux::Dispose (void) +L3Demux::DoDispose (void) { for (L3Map_t::iterator i = m_protocols.begin(); i != m_protocols.end(); ++i) { @@ -54,6 +56,7 @@ L3Demux::Dispose (void) m_node->Unref (); m_node = 0; } + NsUnknown::DoDispose (); } TraceResolver * diff --git a/src/node/l3-demux.h b/src/node/l3-demux.h index 71ab0df2f..9986312a6 100644 --- a/src/node/l3-demux.h +++ b/src/node/l3-demux.h @@ -28,7 +28,7 @@ #define L3_DEMUX_H #include -#include "ns3/object.h" +#include "ns3/ns-unknown.h" namespace ns3 { @@ -40,15 +40,14 @@ class TraceContext; /** * \brief L3 Demux */ -class L3Demux : public Object +class L3Demux : public NsUnknown { public: + static const uint32_t iid; typedef int ProtocolTraceType; L3Demux(Node *node); virtual ~L3Demux(); - void Dispose (void); - /** * \param context the trace context to use to construct the * TraceResolver to return @@ -86,6 +85,8 @@ public: * returned from the L3Protocol::Insert method. */ void Erase(ns3::L3Protocol*protocol); +protected: + virtual void DoDispose (void); private: typedef std::map L3Map_t; diff --git a/src/node/l3-protocol.cc b/src/node/l3-protocol.cc index acf841267..71dbc2d46 100644 --- a/src/node/l3-protocol.cc +++ b/src/node/l3-protocol.cc @@ -45,4 +45,10 @@ L3Protocol::GetVersion() const return m_version; } +void +L3Protocol::DoDispose (void) +{ + Object::DoDispose (); +} + }//namespace ns3 diff --git a/src/node/l3-protocol.h b/src/node/l3-protocol.h index 26d195fe5..d309aca9a 100644 --- a/src/node/l3-protocol.h +++ b/src/node/l3-protocol.h @@ -46,8 +46,6 @@ public: int GetProtocolNumber (void) const; int GetVersion() const; - virtual void Dispose (void) = 0; - virtual TraceResolver *CreateTraceResolver (TraceContext const &context) = 0; /** * Lower layer calls this method after calling L3Demux::Lookup @@ -58,7 +56,9 @@ public: */ virtual void Receive(Packet& p, NetDevice *device) = 0; - private: +protected: + virtual void DoDispose (void); +private: int m_protocolNumber; int m_version; }; diff --git a/src/node/node.cc b/src/node/node.cc index 8de6008e9..296aff23f 100644 --- a/src/node/node.cc +++ b/src/node/node.cc @@ -90,7 +90,7 @@ Node::GetNDevices (void) const return m_devices.size (); } -void Node::Dispose() +void Node::DoDispose() { for (std::vector::iterator i = m_devices.begin (); i != m_devices.end (); i++) @@ -100,13 +100,9 @@ void Node::Dispose() device->Unref (); } m_devices.erase (m_devices.begin (), m_devices.end ()); + NsUnknown::DoDispose (); } -L3Demux* -Node::GetL3Demux() const -{ - return 0; -} Ipv4L4Demux* Node::GetIpv4L4Demux() const { diff --git a/src/node/node.h b/src/node/node.h index 10649fe7c..66bb6480d 100644 --- a/src/node/node.h +++ b/src/node/node.h @@ -32,7 +32,6 @@ namespace ns3 { class ApplicationList; -class L3Demux; class Ipv4L4Demux; class Ipv4; class Udp; @@ -60,9 +59,9 @@ public: uint32_t AddDevice (NetDevice *device); NetDevice *GetDevice (uint32_t index) const; uint32_t GetNDevices (void) const; - - virtual void Dispose (void); +protected: + virtual void DoDispose (void); private: virtual void DoAddDevice (NetDevice *device) const = 0; @@ -74,7 +73,6 @@ public: // Each of these has a default behavior of returning a null capability // of the correct type if one exists, or the nil pointer if no // null capability exists. - virtual L3Demux* GetL3Demux() const; virtual Ipv4L4Demux* GetIpv4L4Demux() const; virtual ApplicationList* GetApplicationList() const; virtual Ipv4 * GetIpv4 (void) const; diff --git a/src/node/udp.cc b/src/node/udp.cc index 5592a6142..780d11c43 100644 --- a/src/node/udp.cc +++ b/src/node/udp.cc @@ -57,7 +57,7 @@ Udp::CreateTraceResolver (TraceContext const &context) } void -Udp::Dispose (void) +Udp::DoDispose (void) { if (m_endPoints != 0) { @@ -69,6 +69,7 @@ Udp::Dispose (void) m_node->Unref (); m_node = 0; } + Ipv4L4Protocol::DoDispose (); } Socket * diff --git a/src/node/udp.h b/src/node/udp.h index c5372527a..6728d1d96 100644 --- a/src/node/udp.h +++ b/src/node/udp.h @@ -43,8 +43,6 @@ public: Udp (Node *node); virtual ~Udp (); - virtual void Dispose (void); - virtual TraceResolver *CreateTraceResolver (TraceContext const &context); Socket *CreateSocket (void); @@ -64,7 +62,9 @@ public: virtual void Receive(Packet& p, Ipv4Address const &source, Ipv4Address const &destination); - private: +protected: + virtual void DoDispose (void); +private: Node *m_node; Ipv4EndPointDemux *m_endPoints; };