コード例 #1
0
        /// <summary>
        /// Once the algorithm has finished use the information it has stored to update the routing table.
        /// </summary>
        private void UpdateRoutingTable()
        {
            IKeyTable <IMLink> oldTable = ForwardingTable;

            foreach (DijkstraNode target in _confirmed)
            {
                if (target.ID != ID)
                {
                    //Work backwards along the route, starting at the target, until the first hop is found
                    DijkstraNode prev = target;
                    while (prev != null && !Equals(prev.GetPrev(ID)))
                    {
                        prev = prev.GetPrev(ID);
                    }

                    if (prev != null && Links.ContainsKey(prev.ID))
                    {
                        IMLink l = Links[prev.ID];
                        SetRoute(Algorithm, target.ID, l, target.GetDistanceFromRoot(ID));
                        oldTable.Remove(target.ID);
                    }
                }
            }
            //Trigger events for any nodes that can no longer be routed to
            foreach (IMNodeInternal n in KnownNodes)
            {
                if (oldTable.ContainsKey(n.ID))
                {
                    RemoveRoute(Algorithm, n.ID);
                }
            }
        }
コード例 #2
0
 protected virtual void RemoveLink(TLink link, Parameters parameters)
 {
     lock (this) {
         link.Parameters.Append(parameters);
         link.Destroy();
         _links.Remove(link.ID);
         _neighbours[link.FromID].Remove(link.ID);
         _connections[link.FromID].Remove(link.ToID);
         if (link.IsBidirectional)
         {
             _neighbours[link.ToID].Remove(link.ID);
             _connections[link.ToID].Remove(link.FromID);
         }
         Logger.Info("Removed '" + link.Name + "'.");
     }
 }
コード例 #3
0
 public virtual void RemoveNode(UUID n, Parameters parameters)
 {
     if (!IsNode(n))
     {
         return;
     }
     //throw new Exception("Unable to remove entity. Given ID is not a known node.");
     lock (this) {
         INode node = GetNode(n);
         node.Parameters.Append(parameters);
         node.Destroy();
         _neighbours.Remove(n);
         _connections.Remove(n);
         _nodes.Remove(n);
         Logger.Debug("Removed node '" + node.Name + "'.");
     }
 }
コード例 #4
0
 public override void RemoveNode(UUID node, Parameters parameters)
 {
     base.RemoveNode(node, parameters);
     _view.RemoveNode(node, parameters);
     if (_knownNodes.ContainsKey(node))
     {
         _knownNodes.Remove(node);
     }
 }
コード例 #5
0
        public void UnMap(UUID id, string name)
        {
            if (_readerMap.ContainsKey(name))
            {
                _readerMap.Remove(name);
            }

            if (_recordingEnabled && _writers.ContainsKey(id))
            {
                _writers[id].StopRecording();
                _writers.Remove(id);
                _writerMap.Remove(id);
            }
        }
コード例 #6
0
 protected void RemoveRoute(string alg, UUID target)
 {
     if (_table.ContainsKey(target))
     {
         IMLink oldLink = _table[target];
         float  oldDist = _distances[target];
         _table.Remove(target);
         _distances.Remove(target);
         if (OnRouteChange != null && IsCurrentAlgorithm)
         {
             OnRouteChange(alg, KnownNodes[target], oldLink, null, oldDist, -1f);
         }
     }
 }
コード例 #7
0
        /// <inhertidoc />
        public void RemoveLink(UUID l, Parameters parameters)
        {
            if (!Neighbours.ContainsKey(l))
            {
                throw new Exception("The link to be remove is not a known link.");
            }

            IMNodeInternal neighbour = _neighbours[l];
            IMLink         link      = _links[neighbour.ID];

            link.OnWeightChanged -= _weightDelegate;

            lock (_links) {
                _links.Remove(neighbour.ID);
                _links.Remove(l);
            } lock (_neighbours)
                _neighbours.Remove(link.ID);

            if (OnLinkRemoved != null && !parameters.Get <bool>("Clearing"))
            {
                OnLinkRemoved(ID, link, parameters);
                Logger.Debug(Name + " triggered OnLinkRemoved for '" + link.Name + "'.");
            }
        }
コード例 #8
0
        public bool RemovePrim(UUID id)
        {
            if (!_prims.ContainsKey(id))
            {
                return(false);
            }

            IPrim prim = _prims[id];

            if (prim is MRMPrim)
            {
                ((MRMPrim)prim).RemoveListeners();
            }
            prim.Editable = true;
            IObject obj = GetIObject(id);

            if (obj != null && obj.Exists)
            {
                obj.Scale = Vector3.Zero;
            }
            _logger.Debug("Queued " + prim.Name + " to be removed.");

            _factoryQ.QWork("Remove Primitive", () => {
                if (!_prims.ContainsKey(id))
                {
                    return;
                }
                lock (_prims)
                    _prims.Remove(id);

                if (_recycle && _freeObjects.Count < MAX_RECYCLED_PRIMS)
                {
                    _freeObjects.Add(id, GetIObject(id));
                    _logger.Info("Recycled " + prim.Name + ".");
                }
                else
                {
                    WorldRemove(id);
                }
            });
            return(true);
        }
コード例 #9
0
ファイル: DVNode.cs プロジェクト: JohnMcCaffery/RoutingIsland
 protected override void LinkRemoved(IMLink link, Parameters parameters, bool visualise)
 {
     lock (neighbourVectors)
         neighbourVectors.Remove(link.OtherEnd(ID));
     findShortestPaths(TTL, "'" + link.Name + "' removed", visualise);
 }