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;
}
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.

View File

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

View File

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

View File

@ -40,7 +40,31 @@ UdpSocket::UdpSocket (Node *node)
}
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 *

View File

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

View File

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