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;
|
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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 *
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue