Exemple #1
0
        internal void ResetPeer(MessageSession session, ResetPeerMessage msg)
        {
            _serverMapLock.DoWrite(() =>
                {
                    if (!_serverMap.ContainsKey(session))
                        return;

                    var server = _serverMap[session];
                    Logger.Write("Disconnected: [{0}] {1}:{2}", server.Name, server.Host, server.Port);

                    _serverMap.Remove(session);
                });

            _interChatLock.DoWrite(() =>
                {
                    if (!_interChatUserMap.ContainsKey(session))
                        return;

                    var userName = _interChatUserMap[session];
                    Logger.Write("Disconnected: InterChat [{0}]", userName);

                    _interChatUserMap.Remove(session);

                    BroadcastChatMsgWithNoLock("system", userName + "께서 접속을 종료하였습니다.");
                    BroadcastCommandMsgWithNoLock(InterChatCommandType.InformLogoutUser, userName);
                });
        }
Exemple #2
0
 internal void RegisterServer(MessageSession session, ServerMsg msg)
 {
     _serverMapLock.DoWrite(() =>
         {
             _serverMap.Add(session, msg);
             Logger.Write("Connected: [{0}] {1}:{2}", msg.Name, msg.Host, msg.Port);
         });
 }
Exemple #3
0
 internal bool Add(int sessionId, MessageSession session)
 {
     _lock.DoWrite(() =>
     {
         _sessionMap.Add(sessionId, session);
         _idMap.Add(session, sessionId);
     });
     return(true);
 }
Exemple #4
0
        public bool Add(string name, int entityId)
        {
            return(_lock.DoWrite(() =>
            {
                if (_cacheMap.ContainsKey(name))
                {
                    return false;
                }

                _cacheMap.Add(name, entityId);
                return true;
            }));
        }
Exemple #5
0
 private InterChatUser FindOrCreateUserWithLock(string userName)
 {
     return _userMapLock.DoWrite(() =>
         {
             if (!_userMap.ContainsKey(userName))
                 _userMap.Add(userName, new InterChatUser {Name = userName});
             return _userMap[userName];
         });
 }
 public bool TryAddChainedHeader(ChainedHeader chainedHeader)
 {
     return(totalWorkLock.DoWrite(() =>
     {
         if (this.chainedHeaders.TryAdd(chainedHeader.Hash, chainedHeader))
         {
             List <ChainedHeader> headersAtTotalWork;
             if (!chainedHeadersByTotalWork.TryGetValue(chainedHeader.TotalWork, out headersAtTotalWork))
             {
                 headersAtTotalWork = new List <ChainedHeader>();
                 chainedHeadersByTotalWork.Add(chainedHeader.TotalWork, headersAtTotalWork);
             }
             headersAtTotalWork.Add(chainedHeader);
             return true;
         }
         else
         {
             return false;
         }
     }));
 }
Exemple #7
0
        internal void BroadcastChatMsgWithNoLock(string userName, string message)
        {
            var msg = new InterChatMsg
                {
                    Name = userName,
                    Message = message,
                    Ticks = DateTime.Now.Ticks
                };

            _interChatMessageLock.DoWrite(() =>
                {
                    _lastMessages.Enqueue(msg);
                    while (_lastMessages.Count > PreserveMessageCount)
                        _lastMessages.Dequeue();
                });

            foreach (var eachSession in _interChatUserMap.Keys)
                eachSession.Send(msg);
        }
Exemple #8
0
        private void CheckAndDisconnect<T>(ReaderWriterLockSlim locker, Dictionary<MessageSession, T> sessionMap)
        {
            const int tolerantInterval = 3 * 60 * 1000;

            var removalSessions = locker.DoWrite(() =>
                    sessionMap.Keys.Where(e => (DateTime.Now - e.LastReceiveTime).TotalMilliseconds >= tolerantInterval)
                              .ToArray());

            foreach (var session in removalSessions)
                ResetPeer(session, new ResetPeerMessage());

            // 해당 연결을 모두 제거한다.
            foreach (var session in removalSessions)
            {
                try
                {
                    session.Dispose();
                }
                catch
                {
                }
            }
        }
Exemple #9
0
        public void AddBlock(ChainedHeader chainedHeader, IEnumerable <BlockTx> blockTxes, CancellationToken cancelToken = default(CancellationToken))
        {
            var confirmedTxes = ImmutableDictionary.CreateBuilder <UInt256, UnconfirmedTx>();

            updateLock.DoWrite(() =>
            {
                using (var handle = storageManager.OpenUnconfirmedTxesCursor())
                {
                    var unconfirmedTxesCursor = handle.Item;

                    unconfirmedTxesCursor.BeginTransaction();

                    var newChain = chain.Value.ToBuilder().AddBlock(chainedHeader).ToImmutable();

                    foreach (var blockTx in blockTxes)
                    {
                        // remove any txes confirmed in the block from the list of unconfirmed txes
                        UnconfirmedTx unconfirmedTx;
                        if (unconfirmedTxesCursor.TryGetTransaction(blockTx.Hash, out unconfirmedTx))
                        {
                            // track confirmed txes
                            confirmedTxes.Add(unconfirmedTx.Hash, unconfirmedTx);

                            if (!unconfirmedTxesCursor.TryRemoveTransaction(blockTx.Hash))
                            {
                                throw new InvalidOperationException();
                            }
                        }

                        // check for and remove any unconfirmed txes that conflict with the confirmed tx
                        var confirmedTx = blockTx.EncodedTx.Decode().Transaction;
                        foreach (var input in confirmedTx.Inputs)
                        {
                            var conflictingTxes = unconfirmedTxesCursor.GetTransactionsSpending(input.PrevTxOutputKey);
                            if (conflictingTxes.Count > 0)
                            {
                                logger.Warn($"Removing {conflictingTxes.Count} conflicting txes from the unconfirmed transaction pool");

                                // remove the conflicting unconfirmed txes
                                foreach (var conflictingTx in conflictingTxes.Keys)
                                {
                                    if (!unconfirmedTxesCursor.TryRemoveTransaction(conflictingTx))
                                    {
                                        throw new StorageCorruptException(StorageType.UnconfirmedTxes, $"{conflictingTx} is indexed but not present");
                                    }
                                }
                            }
                        }
                    }

                    unconfirmedTxesCursor.ChainTip = chainedHeader;

                    commitLock.DoWrite(() =>
                    {
                        unconfirmedTxesCursor.CommitTransaction();
                        chain = new Lazy <Chain>(() => newChain).Force();
                    });
                }
            });

            TxesConfirmed?.Invoke(this, new TxesConfirmedEventArgs(chainedHeader, confirmedTxes.ToImmutable()));
        }
Exemple #10
0
 public void Start()
 {
     controlLock.DoWrite(() => InternalStart());
 }
Exemple #11
0
 public void AddHandler(int typeId, THandler handler)
 {
     _lock.DoWrite(() => _handlerMap.Add(typeId, handler));
 }