use Dispose more extensively

Mathieu Lacage 2007-05-02 22:32:25 +02:00
parent 3dbf9f25e1
commit 43154a6a64
15 changed files with 98 additions and 17 deletions

View File

@ -43,12 +43,23 @@ Arp::Arp (Node *node)
}
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 *

View File

@ -44,6 +44,8 @@ public:
~Arp ();
virtual Arp *Copy (Node *node) const;
virtual void Dispose (void);
virtual TraceResolver *CreateTraceResolver (TraceContext const &context);
virtual void Receive(Packet& p, NetDevice *device);

View File

@ -59,7 +59,6 @@ InternetNode::SetName (std::string name)
m_name = name;
}
TraceResolver *
InternetNode::CreateTraceResolver (TraceContext const &context)
{
@ -78,6 +77,9 @@ InternetNode::CreateTraceResolver (TraceContext const &context)
void InternetNode::Dispose()
{
m_l3Demux->Dispose ();
m_ipv4L4Demux->Dispose ();
// chain up.
Node::Dispose ();
}

View File

@ -37,14 +37,25 @@ Ipv4L4Demux::Ipv4L4Demux (Node *node)
}
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
{

View File

@ -44,6 +44,8 @@ public:
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.

View File

@ -49,6 +49,8 @@ public:
Ipv4L4Protocol(int protocolNumber, int version);
virtual ~Ipv4L4Protocol ();
virtual void Dispose (void) = 0;
/**
* \returns the protocol number of this protocol.
*/

View File

@ -55,11 +55,18 @@ Ipv4::Ipv4(Node *node)
m_node->Ref ();
}
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 @@ Ipv4::~Ipv4 ()
{
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

View File

@ -61,6 +61,8 @@ public:
Ipv4(Node *node);
virtual ~Ipv4 ();
virtual void Dispose (void);
/**
* \param context the trace context to use to construct the
* TraceResolver to return

View File

@ -36,13 +36,24 @@ L3Demux::L3Demux (Node *node)
}
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 *

View File

@ -46,6 +46,8 @@ public:
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.

View File

@ -44,6 +44,8 @@ public:
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;

View File

@ -39,8 +39,7 @@ UdpSocket::UdpSocket (Node *node)
}
UdpSocket::~UdpSocket ()
{
m_node->Unref ();
m_node = 0;
Destroy ();
}
Node *
@ -50,15 +49,20 @@ UdpSocket::PeekNode (void) const
}
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;

View File

@ -76,7 +76,7 @@ private:
// 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);

View File

@ -47,9 +47,7 @@ Udp::Udp (Node *node)
Udp::~Udp ()
{
delete m_endPoints;
m_node->Unref ();
m_node = 0;
Dispose ();
}
TraceResolver *
@ -58,6 +56,21 @@ Udp::CreateTraceResolver (TraceContext const &context)
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)
{

View File

@ -43,6 +43,8 @@ public:
Udp (Node *node);
virtual ~Udp ();
virtual void Dispose (void);
virtual TraceResolver *CreateTraceResolver (TraceContext const &context);
Socket *CreateSocket (void);