Example #1
0
        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;
        }
Example #2
0
 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);
 }
Example #3
0
        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();
                }
            }
        }
Example #4
0
 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;
 }