use Dispose more extensively
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Wed, 02 May 2007 22:32:25 +0200
changeset 496 894c8380d57b
parent 495 a839408950b9
child 497 34d6f349478f
use Dispose more extensively
src/node/arp.cc
src/node/arp.h
src/node/internet-node.cc
src/node/ipv4-l4-demux.cc
src/node/ipv4-l4-demux.h
src/node/ipv4-l4-protocol.h
src/node/ipv4.cc
src/node/ipv4.h
src/node/l3-demux.cc
src/node/l3-demux.h
src/node/l3-protocol.h
src/node/udp-socket.cc
src/node/udp-socket.h
src/node/udp.cc
src/node/udp.h
--- a/src/node/arp.cc	Wed May 02 19:14:34 2007 +0200
+++ b/src/node/arp.cc	Wed May 02 22:32:25 2007 +0200
@@ -44,11 +44,22 @@
 
 Arp::~Arp ()
 {
+  Dispose ();
+}
+
+void 
+Arp::Dispose (void)
+{
   for (CacheList::const_iterator i = m_cacheList.begin (); i != m_cacheList.end (); i++)
     {
       delete *i;
     }
-  m_node->Unref ();
+  m_cacheList.clear ();
+  if (m_node != 0)
+    {
+      m_node->Unref ();
+      m_node = 0;
+    }
 }
 
 Arp *
--- a/src/node/arp.h	Wed May 02 19:14:34 2007 +0200
+++ b/src/node/arp.h	Wed May 02 22:32:25 2007 +0200
@@ -44,6 +44,8 @@
   ~Arp ();
   virtual Arp *Copy (Node *node) const;
 
+  virtual void Dispose (void);
+
   virtual TraceResolver *CreateTraceResolver (TraceContext const &context);
 
   virtual void Receive(Packet& p, NetDevice *device);
--- a/src/node/internet-node.cc	Wed May 02 19:14:34 2007 +0200
+++ b/src/node/internet-node.cc	Wed May 02 22:32:25 2007 +0200
@@ -59,7 +59,6 @@
   m_name = name;
 }
 
-
 TraceResolver *
 InternetNode::CreateTraceResolver (TraceContext const &context)
 {
@@ -78,6 +77,9 @@
 
 void InternetNode::Dispose()
 {
+  m_l3Demux->Dispose ();
+  m_ipv4L4Demux->Dispose ();
+
   // chain up.
   Node::Dispose ();
 }
--- a/src/node/ipv4-l4-demux.cc	Wed May 02 19:14:34 2007 +0200
+++ b/src/node/ipv4-l4-demux.cc	Wed May 02 22:32:25 2007 +0200
@@ -38,13 +38,24 @@
 
 Ipv4L4Demux::~Ipv4L4Demux()
 {
+  Dispose ();
+}
+void
+Ipv4L4Demux::Dispose (void)
+{
   for (L4List_t::const_iterator i = m_protocols.begin(); i != m_protocols.end(); ++i)
     {
+      (*i)->Dispose ();
       delete *i;
     }
-  m_node->Unref ();
-  m_node = 0;
+  m_protocols.clear ();
+  if (m_node != 0)
+    {
+      m_node->Unref ();
+      m_node = 0;
+    }
 }
+
 Ipv4L4Demux* 
 Ipv4L4Demux::Copy(Node *node) const
 {
--- a/src/node/ipv4-l4-demux.h	Wed May 02 19:14:34 2007 +0200
+++ b/src/node/ipv4-l4-demux.h	Wed May 02 22:32:25 2007 +0200
@@ -44,6 +44,8 @@
   Ipv4L4Demux (Node *node);
   virtual ~Ipv4L4Demux();
 
+  void Dispose (void);
+
   /**
    * \param node the node on which the returned copy will run.
    * \returns a deep copy of this L4 Demux.
--- a/src/node/ipv4-l4-protocol.h	Wed May 02 19:14:34 2007 +0200
+++ b/src/node/ipv4-l4-protocol.h	Wed May 02 22:32:25 2007 +0200
@@ -49,6 +49,8 @@
   Ipv4L4Protocol(int protocolNumber, int version);
   virtual ~Ipv4L4Protocol ();
 
+  virtual void Dispose (void) = 0;
+
   /**
    * \returns the protocol number of this protocol.
    */
--- a/src/node/ipv4.cc	Wed May 02 19:14:34 2007 +0200
+++ b/src/node/ipv4.cc	Wed May 02 22:32:25 2007 +0200
@@ -56,10 +56,17 @@
 }
 Ipv4::~Ipv4 ()
 {
+  Dispose ();
+}
+
+void 
+Ipv4::Dispose (void)
+{
   for (Ipv4InterfaceList::iterator i = m_interfaces.begin (); i != m_interfaces.end (); i++)
     {
       delete (*i);
     }
+  m_interfaces.clear ();
   for (HostRoutesI i = m_hostRoutes.begin (); 
        i != m_hostRoutes.end (); 
        i = m_hostRoutes.erase (i)) 
@@ -72,8 +79,16 @@
     {
       delete (*j);
     }
-  delete m_defaultRoute;
-  m_node->Unref ();
+  if (m_defaultRoute != 0)
+    {
+      delete m_defaultRoute;
+      m_defaultRoute = 0;
+    }
+  if (m_node != 0)
+    {
+      m_node->Unref ();
+      m_node = 0;
+    }
 }
 
 void
--- a/src/node/ipv4.h	Wed May 02 19:14:34 2007 +0200
+++ b/src/node/ipv4.h	Wed May 02 22:32:25 2007 +0200
@@ -61,6 +61,8 @@
   Ipv4(Node *node);
   virtual ~Ipv4 ();
 
+  virtual void Dispose (void);
+
   /**
    * \param context the trace context to use to construct the
    *        TraceResolver to return
--- a/src/node/l3-demux.cc	Wed May 02 19:14:34 2007 +0200
+++ b/src/node/l3-demux.cc	Wed May 02 22:32:25 2007 +0200
@@ -36,13 +36,24 @@
 }
 
 L3Demux::~L3Demux()
-{ // Delete each protocol in the map
+{
+  Dispose ();
+}
+
+void
+L3Demux::Dispose (void)
+{
   for (L3Map_t::iterator i = m_protocols.begin(); i != m_protocols.end(); ++i)
     {
+      i->second->Dispose ();
       delete i->second;
     }
-  m_node->Unref ();
-  m_node = 0;
+  m_protocols.clear ();
+  if (m_node != 0)
+    {
+      m_node->Unref ();
+      m_node = 0;
+    }
 }
 
 TraceResolver *
--- a/src/node/l3-demux.h	Wed May 02 19:14:34 2007 +0200
+++ b/src/node/l3-demux.h	Wed May 02 22:32:25 2007 +0200
@@ -46,6 +46,8 @@
   L3Demux(Node *node);
   virtual ~L3Demux();
 
+  void Dispose (void);
+
   /**
    * \param node the node on which the returned copy will run.
    * \returns a deep copy of this L3 Demux.
--- a/src/node/l3-protocol.h	Wed May 02 19:14:34 2007 +0200
+++ b/src/node/l3-protocol.h	Wed May 02 22:32:25 2007 +0200
@@ -44,6 +44,8 @@
   int GetProtocolNumber (void) const;
   int GetVersion() const;
 
+  virtual void Dispose (void) = 0;
+
   virtual L3Protocol* Copy(Node *node) const = 0;
 
   virtual TraceResolver *CreateTraceResolver (TraceContext const &context) = 0;
--- a/src/node/udp-socket.cc	Wed May 02 19:14:34 2007 +0200
+++ b/src/node/udp-socket.cc	Wed May 02 22:32:25 2007 +0200
@@ -39,8 +39,7 @@
 }
 UdpSocket::~UdpSocket ()
 {
-  m_node->Unref ();
-  m_node = 0;
+  Destroy ();
 }
 
 Node *
@@ -50,15 +49,20 @@
 }
 
 void 
-UdpSocket::DestroyEndPoint (void)
+UdpSocket::Destroy (void)
 {
+  if (m_node != 0)
+    {
+      m_node->Unref ();
+      m_node = 0;
+    }
   m_endPoint = 0;
 }
 int
 UdpSocket::FinishBind (void)
 {
   m_endPoint->SetRxCallback (MakeCallback (&UdpSocket::ForwardUp, this));
-  m_endPoint->SetDestroyCallback (MakeCallback (&UdpSocket::DestroyEndPoint, this));
+  m_endPoint->SetDestroyCallback (MakeCallback (&UdpSocket::Destroy, this));
   if (m_endPoint == 0)
     {
       return -1;
--- a/src/node/udp-socket.h	Wed May 02 19:14:34 2007 +0200
+++ b/src/node/udp-socket.h	Wed May 02 22:32:25 2007 +0200
@@ -76,7 +76,7 @@
   // invoked by Udp class
   int FinishBind (void);
   void ForwardUp (const Packet &p, Ipv4Address saddr, uint16_t sport);
-  void DestroyEndPoint (void);
+  void Destroy (void);
   Udp *GetUdp (void) const;
   int DoSendPacketTo (const Packet &p, Ipv4Address daddr, uint16_t dport,
 		      ns3::Callback<void, Socket*, uint32_t> dataSent);
--- a/src/node/udp.cc	Wed May 02 19:14:34 2007 +0200
+++ b/src/node/udp.cc	Wed May 02 22:32:25 2007 +0200
@@ -47,9 +47,7 @@
 
 Udp::~Udp ()
 {
-  delete m_endPoints;
-  m_node->Unref ();
-  m_node = 0;
+  Dispose ();
 }
 
 TraceResolver *
@@ -58,6 +56,21 @@
   return new EmptyTraceResolver (context);
 }
 
+void
+Udp::Dispose (void)
+{
+  if (m_endPoints != 0)
+    {
+      delete m_endPoints;
+      m_endPoints = 0;
+    }
+  if (m_node != 0)
+    {
+      m_node->Unref ();
+      m_node = 0;
+    }
+}
+
 Socket *
 Udp::CreateSocket (void)
 {
--- a/src/node/udp.h	Wed May 02 19:14:34 2007 +0200
+++ b/src/node/udp.h	Wed May 02 22:32:25 2007 +0200
@@ -43,6 +43,8 @@
   Udp (Node *node);
   virtual ~Udp ();
 
+  virtual void Dispose (void);
+
   virtual TraceResolver *CreateTraceResolver (TraceContext const &context);
 
   Socket *CreateSocket (void);