/// <param name="entry">the record associated with the msg to retransmit. It /// contains the list of receivers that haven't yet ack reception /// </param> internal void _retransmit(Entry entry) { Address sender; bool received; lock (entry) { for (System.Collections.IEnumerator e = entry.senders.Keys.GetEnumerator(); e.MoveNext();) { sender = (Address)e.Current; received = ((System.Boolean)entry.senders[sender]); if (!received) { if (suspects.Contains(sender)) { NCacheLog.Warn("AckMcastSenderWindow", "removing " + sender + " from retransmit list as it is in the suspect list"); remove(sender); continue; } NCacheLog.Warn("AckMcastSenderWindow", "--> retransmitting msg #" + entry.seqno + " to " + sender); cmd.retransmit(entry.seqno, entry.msg.copy(), sender); } } } }
/// <summary> /// For each interval, call the retransmission callback command /// </summary> public override void run() { long[] bounds; lock (this) { for (int i = 0; i < list.Count; ++i) { bounds = (long[])list[i]; retCmd.retransmit(bounds[0], bounds[1], initialSender); } } }
/* -------------------------------- Retransmitter.RetransmitCommand interface ------------------- */ public virtual void retransmit(long first_seqno, long last_seqno, Address sender) { Message msg; if (retransmit_command != null) { for (long i = first_seqno; i <= last_seqno; i++) { if ((msg = (Message)msgs[(long)i]) != null) { // find the message to retransmit retransmit_command.retransmit(i, msg); } } } }