fix valgrind warning: UdpSocket must manage carefully its Ipv4EndPoint to avoid double deleting it.

Mathieu Lacage 2007-05-03 13:11:50 +02:00
parent 69ffe8defb
commit b0399a9f9c
6 changed files with 50 additions and 3 deletions

View File

@ -127,6 +127,20 @@ Ipv4EndPointDemux::Allocate (Ipv4Address localAddress, uint16_t localPort,
return endPoint; return endPoint;
} }
void
Ipv4EndPointDemux::DeAllocate (Ipv4EndPoint *endPoint)
{
for (EndPointsI i = m_endPoints.begin (); i != m_endPoints.end (); i++)
{
if (*i == endPoint)
{
delete endPoint;
m_endPoints.erase (i);
break;
}
}
}
/* /*
* If we have an exact match, we return it. * If we have an exact match, we return it.

View File

@ -51,6 +51,8 @@ public:
Ipv4Address peerAddress, Ipv4Address peerAddress,
uint16_t peerPort); uint16_t peerPort);
void DeAllocate (Ipv4EndPoint *endPoint);
private: private:
uint16_t AllocateEphemeralPort (void); uint16_t AllocateEphemeralPort (void);
typedef std::list<Ipv4EndPoint *> EndPoints; typedef std::list<Ipv4EndPoint *> EndPoints;

View File

@ -51,7 +51,6 @@ Node::Node(uint32_t sid)
Node::~Node () Node::~Node ()
{} {}
uint32_t uint32_t
Node::GetId (void) const Node::GetId (void) const
{ {
@ -99,7 +98,7 @@ void Node::DoDispose()
device->Dispose (); device->Dispose ();
device->Unref (); device->Unref ();
} }
m_devices.erase (m_devices.begin (), m_devices.end ()); m_devices.clear ();
NsUnknown::DoDispose (); NsUnknown::DoDispose ();
} }

View File

@ -40,7 +40,31 @@ UdpSocket::UdpSocket (Node *node)
} }
UdpSocket::~UdpSocket () UdpSocket::~UdpSocket ()
{ {
Destroy (); if (m_node != 0)
{
m_node->Unref ();
m_node = 0;
}
if (m_endPoint != 0)
{
NS_ASSERT (m_udp != 0);
/**
* Note that this piece of code is a bit tricky:
* when DeAllocate is called, it will call into
* Ipv4EndPointDemux::Deallocate which triggers
* a delete of the associated endPoint which triggers
* in turn a call to the method ::Destroy below
* will will zero the m_endPoint field.
*/
NS_ASSERT (m_endPoint != 0);
m_udp->DeAllocate (m_endPoint);
NS_ASSERT (m_endPoint == 0);
}
if (m_udp != 0)
{
m_udp->Unref ();
m_udp = 0;
}
} }
Node * Node *

View File

@ -106,6 +106,12 @@ Udp::Allocate (Ipv4Address localAddress, uint16_t localPort,
peerAddress, peerPort); peerAddress, peerPort);
} }
void
Udp::DeAllocate (Ipv4EndPoint *endPoint)
{
m_endPoints->DeAllocate (endPoint);
}
void void
Udp::Receive(Packet& packet, Udp::Receive(Packet& packet,
Ipv4Address const &source, Ipv4Address const &source,

View File

@ -54,6 +54,8 @@ public:
Ipv4EndPoint *Allocate (Ipv4Address localAddress, uint16_t localPort, Ipv4EndPoint *Allocate (Ipv4Address localAddress, uint16_t localPort,
Ipv4Address peerAddress, uint16_t peerPort); Ipv4Address peerAddress, uint16_t peerPort);
void DeAllocate (Ipv4EndPoint *endPoint);
// called by UdpSocket. // called by UdpSocket.
void Send (Packet packet, void Send (Packet packet,
Ipv4Address saddr, Ipv4Address daddr, Ipv4Address saddr, Ipv4Address daddr,