/**
* Handles Rrm TimeoutChecking as well as removing stale entries from the
* _unannounced Edge dictionary.
*/
protected void TimeoutCheck()
{
_rrm.TimeoutChecker(null, null);
DateTime now = DateTime.UtcNow;
long next = _next_check;
if (next < now.Ticks)
{
// If someone else is checking it, let's just end it here
long current = Interlocked.Exchange(ref _next_check, now.AddMinutes(5).Ticks);
if (next != current)
{
return;
}
}
// Get the list of old edges
DateTime remove_timeout = now.AddMinutes(-5);
List <Edge> to_close = new List <Edge>();
lock (_sync) {
foreach (Edge e in _unannounced.Keys)
{
if (e.CreatedDateTime < remove_timeout)
{
to_close.Add(e);
}
}
}
// Close the Edges
foreach (Edge e in to_close)
{
PathEdge pe = null;
if (!_unannounced.TryGetValue(e, out pe))
{
continue;
}
try {
pe.Close();
} catch (Exception ex) {
Console.WriteLine(ex);
}
}
// Remove them from the _unannounced dictionary
lock (_sync) {
foreach (Edge e in to_close)
{
_unannounced.Remove(e);
}
}
}