From f02bf05c7b639f5edb86388c96dbb209a4622be9 Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Fri, 15 Nov 2024 13:23:06 -0500 Subject: reliable multicast: prune received list --- .../java/derms/net/rmulticast/ReceivedSet.java | 57 +++++++++++++++++++--- 1 file changed, 50 insertions(+), 7 deletions(-) (limited to 'src/main/java/derms/net/rmulticast/ReceivedSet.java') diff --git a/src/main/java/derms/net/rmulticast/ReceivedSet.java b/src/main/java/derms/net/rmulticast/ReceivedSet.java index 339a714..963b321 100644 --- a/src/main/java/derms/net/rmulticast/ReceivedSet.java +++ b/src/main/java/derms/net/rmulticast/ReceivedSet.java @@ -1,14 +1,18 @@ package derms.net.rmulticast; import java.io.Serializable; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; +import java.net.InetAddress; +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; class ReceivedSet { - private final Set> received; + private final Queue> received; ReceivedSet() { - this.received = new ConcurrentHashMap, Void>().keySet(); + this.received = new ConcurrentLinkedQueue>(); } void add(Message e) { @@ -16,10 +20,49 @@ class ReceivedSet { } // TODO: faster search. - boolean contains(MessageID mid) { + Message getByID(MessageID mid) throws NoSuchElementException { for (Message msg : received) if (msg.id().equals(mid)) - return true; - return false; + return msg; + throw new NoSuchElementException("message " + mid + " not in received list."); + } + + boolean contains(MessageID mid) { + try { + Message msg = getByID(mid); + return true; + } catch (NoSuchElementException e) { + return false; + } + } + + /** Remove the specified message from the set, if it is present. */ + void remove(Message msg) { + received.remove(msg); + } + + /** Retrieves, but does not remove, the oldest message, or returns null if the set is empty. */ + Message peekOldest() { + return received.peek(); + } + + Message mostRecentSentBy(InetAddress member) throws NoSuchElementException { + Message recent = null; + for (Message msg : received) { + if (msg.sender.equals(member)) + recent = msg; + } + if (recent == null) + throw new NoSuchElementException("no message from " + member + " in received list."); + return recent; + } + + List> allSentBy(InetAddress sender) { + List> sent = new ArrayList>(); + for (Message msg : received) { + if (msg.sender.equals(sender)) + sent.add(msg); + } + return sent; } } -- cgit v1.2.3