public Service JoinService(IChannel channel, int id, JArray address, int port) { if (id == -1) { //_servicesLock.EnterWriteLock(); id = ++_maxIndex; if (_maxIndex >= _services.Length) //공간이 작다. 공간을 늘린다. { var temp = new Service[_services.Length]; System.Array.Copy(_services, temp, _services.Length); _services = temp; } _services[id] = new Service(this, id, address, port); dynamic packet = new JObject(); packet.type = "change_service_id"; packet.id = id; channel.SendMessage(packet); //_servicesLock.ExitWriteLock(); } //_servicesLock.EnterReadLock(); var service = _services[id]; //_servicesLock.ExitReadLock(); service.AddChannel(channel); return service; }
public void NotifyJoinService(Service service, Network network) { dynamic packet = new JObject(); packet.type = "notify_join_service"; packet.service = service.GetServiceName(); packet.id = service._id; packet.address = network.GetAddress(service); packet.port = service._port; this.SendPacket(packet); }
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(); } } }
public int NotifyJoinService(Service service, Network network) { int count = 0; //이제 연결된 서비스들에게 상태를 보고함. for (int i = 0; i <= _maxIndex; i++) { if(network.GetAddress(_services[i]) == null) continue; _services[i].NotifyJoinService(service, network); count++; } return count; }