Esempio n. 1
0
 public void QueueMessage(OutboundMessage msg)
 {
     lock (_messageQueue)
     {
         _messageQueue.Enqueue(msg);
     }
 }
Esempio n. 2
0
        private List <InFlightMessage> ChooseMsg()
        {
            lock (_inFlight)
            {
                _inFlight.RemoveAll(m => IdIsLessThanEqualOther(m.Message.PacketId, _lastReceivedAck));

                // If any were resent, then dont send anything new
                if (_inFlight.Count > 0)
                {
                    DateTime now = DateTime.Now;
                    if (_inFlight.Any(m => GetTimeBetween(m.LastSent, now) > InFlightTimeout))
                    {
                        List <InFlightMessage> toResend = _inFlight.ToList();
                        Log.WarnFormat("{0} - Resending {1} packets from #{2}", Endpoint, toResend.Count, toResend[0].Message.PacketId);
                        return(toResend);
                    }
                }

                if (_inFlight.Count >= MaxInFlight)
                {
                    return(null);
                }

                lock (_messageQueue)
                {
                    if (_messageQueue.Any())
                    {
                        // create new message, send it and track it
                        var msg = new InFlightMessage(_messageQueue.Dequeue().WithPacketId(NextPacketId), 0); // TODO - should this be able to perform an ack?
                        _inFlight.Add(msg);
                        return(new List <InFlightMessage> {
                            msg
                        });
                    }
                }

                OutboundMessage obMsg = CompileNextMessage();
                if (obMsg == null)
                {
                    return(null);
                }

                uint ackId = 0;
                lock (_lastSentAckLock)
                {
                    bool shouldSend = _readyToAck > _lastSentAck;
                    if (shouldSend)
                    {
                        ackId = _readyToAck;
                    }
                }

                var newMsg = new InFlightMessage(obMsg.WithPacketId(NextPacketId), ackId);
                _inFlight.Add(newMsg);
                return(new List <InFlightMessage> {
                    newMsg
                });
            }
        }
Esempio n. 3
0
 public InFlightMessage(OutboundMessage message, uint?ackId)
 {
     Message  = message;
     AckId    = ackId;
     LastSent = DateTime.MinValue;
 }