fix valgrind warning: UdpSocket must manage carefully its Ipv4EndPoint to avoid double deleting it.
parent
69ffe8defb
commit
b0399a9f9c
|
@ -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.
|
||||
|
|
|
@ -51,6 +51,8 @@ public:
|
|||
Ipv4Address peerAddress,
|
||||
uint16_t peerPort);
|
||||
|
||||
void DeAllocate (Ipv4EndPoint *endPoint);
|
||||
|
||||
private:
|
||||
uint16_t AllocateEphemeralPort (void);
|
||||
typedef std::list<Ipv4EndPoint *> EndPoints;
|
||||
|
|
|
@ -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 ();
|
||||
}
|
||||
|
||||
|
|
|
@ -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 *
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue