public void CloseHandler(object edge, EventArgs args)
{
UdpEdge e = (UdpEdge)edge;
lock( _id_ht ) {
if( _id_ht.Contains( e.ID ) ) {
_id_ht.Remove( e.ID );
_send_queue_max -= _send_queue_delta;
object re = _remote_id_ht[ e.RemoteID ];
if( re == e ) {
//_remote_id_ht only keeps track of incoming edges,
//so, there could be two edges with the same remoteid
//that are not equivalent.
_remote_id_ht.Remove( e.RemoteID );
}
NatDataPoint dp = new EdgeClosePoint(DateTime.UtcNow, e);
Interlocked.Exchange<NatHistory>(ref _nat_hist, _nat_hist + dp);
Interlocked.Exchange<IEnumerable>(ref _nat_tas, new NatTAs( _tas, _nat_hist ));
}
}
}