Пример #1
0
        /// <summary>
        /// Merges two receive buffers. Merging preserves sequencing of messages, and drops all messages that has been
        /// safely acknowledged by any of the participating buffers. Also updates the expected sequence numbers.
        /// </summary>
        /// <param name="other">The receive buffer to merge with</param>
        /// <returns>The merged receive buffer</returns>
        public AckedReceiveBuffer <T> MergeFrom(AckedReceiveBuffer <T> other)
        {
            var mergedLastDelivered = SeqNo.Max(this.LastDelivered, other.LastDelivered);

            Buf.UnionWith(other.Buf);
            Buf.RemoveWhere(x => x.Seq < mergedLastDelivered);
            return(Copy(mergedLastDelivered, SeqNo.Max(this.CumulativeAck, other.CumulativeAck), Buf));
        }
Пример #2
0
 /// <summary>
 /// Puts a sequenced message in the receive buffer returning a new buffer.
 /// </summary>
 /// <param name="arrivedMsg">Message to be put into the buffer</param>
 /// <returns>The updated buffer containing the message</returns>
 public AckedReceiveBuffer <T> Receive(T arrivedMsg)
 {
     if (arrivedMsg.Seq > LastDelivered && !Buf.Contains(arrivedMsg))
     {
         Buf.Add(arrivedMsg);
     }
     return(Copy(cumulativeAck: SeqNo.Max(arrivedMsg.Seq, CumulativeAck),
                 buffer: Buf));
 }
Пример #3
0
        /// <summary>
        /// Merges two receive buffers. Merging preserves sequencing of messages, and drops all messages that has been
        /// safely acknowledged by any of the participating buffers. Also updates the expected sequence numbers.
        /// </summary>
        /// <param name="other">The receive buffer to merge with</param>
        /// <returns>The merged receive buffer</returns>
        public AckedReceiveBuffer <T> MergeFrom(AckedReceiveBuffer <T> other)
        {
            var mergedLastDelivered = SeqNo.Max(this.LastDelivered, other.LastDelivered);

            return(Copy(mergedLastDelivered, SeqNo.Max(this.CumulativeAck, other.CumulativeAck), Buf.Union(other.Buf).Where(x => x.Seq > mergedLastDelivered).ToImmutableSortedSet(Comparer)));
        }