public bool RegisterNode(IPEndPoint nodeEndPoint) { IRegisteredNode newNode = ProxyFactory.CreateProxy <IRegisteredNode>(nodeEndPoint); //we need to lock all this since the generation of node ids is dependent of what is in the //dictionary _nodeProxies and the node will only be registered in the dictionary as the last //action. lock (_nodeProxies) { //find an id that is available ushort newNodeId = 0; while (_nodeProxies.ContainsKey(newNodeId)) { if (newNodeId == ushort.MaxValue) { Log.Error("Unable to register more nodes. There are already {0} nodes registered", _nodeProxies.Count); return(false); } newNodeId++; } newNode.SetId(newNodeId); Log.Info("Registered node. Node Id : {0} , Address : {1} , Port : {2}", newNodeId, nodeEndPoint.Address.ToString(), nodeEndPoint.Port); //Notify all existing nodes of this new one foreach (ProxyEndPointMap proxyEndPointMap in _nodeProxies.Values) { proxyEndPointMap.NodeProxy.NodeRegistered(nodeEndPoint); } _nodeProxies.Add(newNodeId, new ProxyEndPointMap(nodeEndPoint, newNode)); } return(true); }
public void UnregisterNode(ushort nodeId) { lock (_nodeProxies) { if (_nodeProxies.ContainsKey(nodeId)) { IRegisteredNode node = _nodeProxies[nodeId].NodeProxy; _nodeProxies.Remove(nodeId); foreach (ProxyEndPointMap proxyEndPointMap in _nodeProxies.Values) { proxyEndPointMap.NodeProxy.NodeUnregistered(nodeId); } Log.Info("Unregistered node, Node Id : {0}", nodeId); ((IDisposable)node).Dispose(); //not strictly necessary due to Dispose, but nice nonetheless } } }
public ProxyEndPointMap(IPEndPoint endPoint, IRegisteredNode nodeProxy) { _endPoint = endPoint; _nodeProxy = nodeProxy; }