public Service(Services services, int id, IEnumerable<JToken> address, int port) { _services = services; _id = id; var addressList = new List<byte[]>(); foreach (var bytes in address) addressList.Add((byte[]) bytes); _address = addressList.ToArray(); _port = port; }
public void JoinService(IChannel channel, string name, int id, JArray address, int port) { var services = GetServices(name); if(services == null) { _servicesLock.EnterWriteLock(); if (!_services.ContainsKey(name)) { services = new Services(name); _services.Add(name, services); } else { services = _services[name]; } _servicesLock.ExitWriteLock(); } _addremoveQueue.Enqueue(new AddRemoveItem() { IsAdd = true, Channel = channel, Address = address, Port=port, Id = id, Services = services }); }
private void AddService(IChannel channel, Services services, int id, JArray address, int port) { var service = services.JoinService(channel, id, address, port); if (id == -1) { dynamic packet = new JObject(); packet.type = "max_entity_id"; packet.value = 10000; channel.SendMessage(packet); var networks = _networkManager.GetNetworks(service); int notifyServiceCount = 0; foreach (var network in networks) { var remoteServiceName = network.Service1 == services.GetServicesName() ? network.Service2 : network.Service1; var remoteService = GetServices(remoteServiceName); if (remoteService == null) continue; notifyServiceCount += remoteService.NotifyJoinService(service, network); } //Interlocked.Increment //여기서 광역 락 시전! //추가 됬다고 정보를 알린 모든 서비스에서 승인이 떨어지면 다음꺼 처리. if (notifyServiceCount > 0) { _addremoveService = service; _notifyServiceCount = notifyServiceCount; _nextAddRemoveProcessing = new AutoResetEvent(false); _nextAddRemoveProcessing.WaitOne(); } } }