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(); }
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(); }
// 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); } }
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(); }
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; }
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 } }
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(); }
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(); }
// 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()); } }
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(); }
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(); }