From 824d7c491a3cb347d744433fd7f175d9dd4c2c46 Mon Sep 17 00:00:00 2001 From: Martin Thomson Date: Wed, 2 Oct 2024 19:34:45 +1000 Subject: [PATCH] Use retain to clear out old streams (#2144) This is simpler code overall. It might even be faster. It certainly avoids an allocation. --- neqo-transport/src/recv_stream.rs | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/neqo-transport/src/recv_stream.rs b/neqo-transport/src/recv_stream.rs index 7b46a386bc..3add6e4d46 100644 --- a/neqo-transport/src/recv_stream.rs +++ b/neqo-transport/src/recv_stream.rs @@ -92,32 +92,19 @@ impl RecvStreams { } pub fn clear_terminal(&mut self, send_streams: &SendStreams, role: Role) -> (u64, u64) { - let recv_to_remove = self - .streams - .iter() - .filter_map(|(id, stream)| { - // Remove all streams for which the receiving is done (or aborted). - // But only if they are unidirectional, or we have finished sending. - if stream.is_terminal() && (id.is_uni() || !send_streams.exists(*id)) { - Some(*id) - } else { - None - } - }) - .collect::>(); - let mut removed_bidi = 0; let mut removed_uni = 0; - for id in &recv_to_remove { - self.streams.remove(id); - if id.is_remote_initiated(role) { + self.streams.retain(|id, s| { + let dead = s.is_terminal() && (id.is_uni() || !send_streams.exists(*id)); + if dead && id.is_remote_initiated(role) { if id.is_bidi() { removed_bidi += 1; } else { removed_uni += 1; } } - } + !dead + }); (removed_bidi, removed_uni) }