コード例 #1
0
        private void DestoreMessage(double now, int storeIndex, out bool resetTimeout)
        {
            // reset timeout if we receive ack within kThreshold of sending it
            const double kThreshold = 2.0;
            var          srm        = m_storedMessages[storeIndex];

            resetTimeout = (srm.NumSent == 1) && (now - srm.LastSent < kThreshold);

            var storedMessage = srm.Message;

            // on each destore; reduce recyclingcount so that when all instances are destored, the outgoing message can be recycled
            Interlocked.Decrement(ref storedMessage.m_recyclingCount);
#if DEBUG
            if (storedMessage == null)
            {
                throw new NetException("m_storedMessages[" + storeIndex + "].Message is null; sent " + m_storedMessages[storeIndex].NumSent + " times, last time " + (NetTime.Now - m_storedMessages[storeIndex].LastSent) + " seconds ago");
            }
#else
            if (storedMessage != null)
            {
#endif
            if (storedMessage.m_recyclingCount <= 0)
            {
                m_connection.m_peer.Recycle(storedMessage);
            }

#if !DEBUG
        }
#endif
            m_storedMessages[storeIndex] = new NetStoredReliableMessage();
        }
コード例 #2
0
        private void DestoreMessage(int storeIndex)
        {
            NetOutgoingMessage storedMessage = m_storedMessages[storeIndex].Message;

            // on each destore; reduce recyclingcount so that when all instances are destored, the outgoing message can be recycled
            Interlocked.Decrement(ref storedMessage.m_recyclingCount);
#if DEBUG
            if (storedMessage == null)
            {
                throw new NetException("m_storedMessages[" + storeIndex + "].Message is null; sent " + m_storedMessages[storeIndex].NumSent + " times, last time " + (NetTime.Now - m_storedMessages[storeIndex].LastSent) + " seconds ago");
            }
#else
            if (storedMessage != null)
            {
#endif
            if (storedMessage.m_recyclingCount <= 0)
            {
                m_connection.m_peer.Recycle(storedMessage);
            }

#if !DEBUG
        }
#endif
            m_usedStoredMessages        &= ~((ulong)1 << storeIndex);      // clear used bit
            m_storedMessages[storeIndex] = new NetStoredReliableMessage();
        }
コード例 #3
0
        // call this regularely
        public override NetSocketResult SendQueuedMessages(TimeSpan now)
        {
            TimeSpan resendDelay = ResendDelay;

            for (int i = 0; i < StoredMessages.Length; i++)
            {
                ref NetStoredReliableMessage storedMessage = ref StoredMessages[i];
                if (storedMessage.Message == null)
                {
                    continue;
                }

                TimeSpan t = storedMessage.LastSent;
                if (t > TimeSpan.Zero && (now - t) > resendDelay)
                {
                    var sendResult = _connection.QueueSendMessage(storedMessage.Message, storedMessage.SequenceNumber);
                    if (!sendResult.Success)
                    {
                        return(sendResult);
                    }
                    storedMessage.LastSent = now;
                    storedMessage.NumSent++;
                    _connection.Statistics.MessageResent(MessageResendReason.Delay);
                }
            }
コード例 #4
0
        private void DestoreMessage(int storeIndex)
        {
            NetOutgoingMessage storedMessage = m_storedMessages[storeIndex].Message;

#if DEBUG
            if (storedMessage == null)
            {
                throw new NetException("m_storedMessages[" + storeIndex + "].Message is null; sent " + m_storedMessages[storeIndex].NumSent + " times, last time " + (NetTime.Now - m_storedMessages[storeIndex].LastSent) + " seconds ago");
            }
#else
            if (storedMessage != null)
            {
#endif
            Interlocked.Decrement(ref storedMessage.m_recyclingCount);
            if (storedMessage.m_recyclingCount <= 0)
            {
                m_connection.m_peer.Recycle(storedMessage);
            }

            MessagesAwaitingAck--;
#if !DEBUG
        }
#endif
            m_storedMessages[storeIndex] = new NetStoredReliableMessage();
        }
コード例 #5
0
        public NetReliableSenderChannel(NetConnection connection, int windowSize)
        {
            LidgrenException.AssertIsPowerOfTwo((ulong)windowSize, nameof(windowSize));

            _connection    = connection;
            _windowSize    = windowSize;
            _windowStart   = 0;
            _sendStart     = 0;
            _receivedAcks  = new NetBitArray(NetConstants.SequenceNumbers);
            StoredMessages = new NetStoredReliableMessage[_windowSize];
            ResendDelay    = connection.ResendDelay;
        }
コード例 #6
0
        private void DestoreMessage(double now, int storeIndex, out bool resetTimeout)
        {
            try
            {
                // reset timeout if we receive ack within kThreshold of sending it
                const double kThreshold = 2.0;
                var          srm        = m_storedMessages[storeIndex];
                resetTimeout = (srm.NumSent == 1) && (now - srm.LastSent < kThreshold);

                var storedMessage = srm.Message;

                // on each destore; reduce recyclingcount so that when all instances are destored, the outgoing message can be recycled
                Interlocked.Decrement(ref storedMessage.m_recyclingCount);
#if DEBUG
                if (storedMessage == null)
                {
                    throw new NetException("m_storedMessages[" + storeIndex + "].Message is null; sent " + m_storedMessages[storeIndex].NumSent + " times, last time " + (NetTime.Now - m_storedMessages[storeIndex].LastSent) + " seconds ago");
                }
#else
                if (storedMessage != null)
                {
#endif
                if (storedMessage.m_recyclingCount <= 0)
                {
                    m_connection.m_peer.Recycle(storedMessage);
                }

#if !DEBUG
            }
#endif
                m_storedMessages[storeIndex] = new NetStoredReliableMessage();
            }
            catch (NullReferenceException exception)
            {
                var arrayString = m_storedMessages == default
                    ? "default"
                    : $"NetStoredReliableMessage[{m_storedMessages.Length}]";

                var atIndexString         = m_storedMessages == default ? "(n/a)" : "initialized";
                var messageString         = m_storedMessages?[storeIndex].Message == default ? "null" : "initialized";
                var exceptionDebugMessage =
                    $"m_storedMessages={arrayString}; m_storedMessages[{storeIndex}]={atIndexString}; m_storedMessages[{storeIndex}].Message={messageString}";
#if DEBUG
                throw new NetException(exceptionDebugMessage, exception);
#else
                m_connection.m_peer.LogDebug(exceptionDebugMessage);
                m_connection.m_peer.LogDebug(exception.ToString());
                resetTimeout = false;
#endif
            }
        }
コード例 #7
0
        private void DestoreMessage(int storeIndex)
        {
            NetOutgoingMessage storedMessage = m_storedMessages[storeIndex].Message;

            NetException.Assert(storedMessage != null);

            Interlocked.Decrement(ref storedMessage.m_recyclingCount);
            if (storedMessage.m_recyclingCount <= 0)
            {
                m_connection.m_peer.Recycle(storedMessage);
            }

            m_storedMessages[storeIndex] = new NetStoredReliableMessage();
        }
コード例 #8
0
		private void DestoreMessage(int storeIndex)
		{
			NetOutgoingMessage storedMessage = m_storedMessages[storeIndex].Message;
#if DEBUG
			if (storedMessage == null)
				throw new NetException("m_storedMessages[" + storeIndex + "].Message is null; sent " + m_storedMessages[storeIndex].NumSent + " times, last time " + (NetTime.Now - m_storedMessages[storeIndex].LastSent) + " seconds ago");
#else
			if (storedMessage != null)
			{
#endif
			Interlocked.Decrement(ref storedMessage.m_recyclingCount);
			if (storedMessage.m_recyclingCount <= 0)
				m_connection.m_peer.Recycle(storedMessage);

#if !DEBUG
			}
#endif
			m_storedMessages[storeIndex] = new NetStoredReliableMessage();
		}
コード例 #9
0
        // call this regularely
        internal override void SendQueuedMessages(float now)
        {
            //
            // resends
            //
            int len = m_storedMessages.Length;

            for (int i = 0; i < len; ++i)
            {
                NetStoredReliableMessage msg = m_storedMessages[i];
                NetOutgoingMessage       om  = msg.Message;
                if (om == null)
                {
                    continue;
                }

                float t = msg.LastSent;
                if (t > 0 && (now - t) > m_resendDelay)
                {
                    // deduce sequence number

                    /*
                     * int startSlot = m_windowStart % m_windowSize;
                     * int seqNr = m_windowStart;
                     * while (startSlot != i)
                     * {
                     *      startSlot--;
                     *      if (startSlot < 0)
                     *              startSlot = m_windowSize - 1;
                     *      seqNr--;
                     * }
                     */

                    //m_connection.m_peer.LogVerbose("Resending due to delay #" + msg.SequenceNumber + " " + om.ToString());
                    m_connection.m_statistics.MessageResent(MessageResendReason.Delay);

                    m_connection.QueueSendMessage(om, msg.SequenceNumber);

                    msg.LastSent = now;
                    ++msg.NumSent;
                }
            }

            int num = GetAllowedSends();

            if (num < 1)
            {
                return;
            }

            // queued sends
            while (m_queuedSends.Count > 0 && num > 0)
            {
                NetOutgoingMessage om;
                if (m_queuedSends.TryDequeue(out om))
                {
                    ExecuteSend(now, om);
                }
                num--;
                NetException.Assert(num == GetAllowedSends());
            }
        }
コード例 #10
0
        private void DestoreMessage(int storeIndex)
        {
            NetOutgoingMessage storedMessage = m_storedMessages[storeIndex].Message;
            NetException.Assert(storedMessage != null);

            Interlocked.Decrement(ref storedMessage.m_recyclingCount);
            if (storedMessage.m_recyclingCount <= 0)
                m_connection.m_peer.Recycle(storedMessage);

            m_storedMessages[storeIndex] = new NetStoredReliableMessage();
        }
コード例 #11
0
		private void DestoreMessage(double now, int storeIndex, out bool resetTimeout)
		{
			// reset timeout if we receive ack within kThreshold of sending it
			const double kThreshold = 2.0;
			var srm = m_storedMessages[storeIndex];
			resetTimeout = (srm.NumSent == 1) && (now - srm.LastSent < kThreshold);

			var storedMessage = srm.Message;

			// on each destore; reduce recyclingcount so that when all instances are destored, the outgoing message can be recycled
			Interlocked.Decrement(ref storedMessage.m_recyclingCount);
#if DEBUG
			if (storedMessage == null)
				throw new NetException("m_storedMessages[" + storeIndex + "].Message is null; sent " + m_storedMessages[storeIndex].NumSent + " times, last time " + (NetTime.Now - m_storedMessages[storeIndex].LastSent) + " seconds ago");
#else
			if (storedMessage != null)
			{
#endif
			if (storedMessage.m_recyclingCount <= 0)
				m_connection.m_peer.Recycle(storedMessage);

#if !DEBUG
			}
#endif
			m_storedMessages[storeIndex] = new NetStoredReliableMessage();
		}