From 33892e28dc7a490f5813898ad62a0b3aca24706d Mon Sep 17 00:00:00 2001 From: "B. Blechschmidt" Date: Sat, 25 Mar 2023 22:23:46 +0100 Subject: [PATCH] Improve code elegance in DNS cache removal function --- src/virtdns.rs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/virtdns.rs b/src/virtdns.rs index e21533b..e848d27 100644 --- a/src/virtdns.rs +++ b/src/virtdns.rs @@ -1,7 +1,7 @@ use hashlink::linked_hash_map::RawEntryMut; use hashlink::LruCache; use smoltcp::wire::Ipv4Cidr; -use std::collections::{HashMap, LinkedList}; +use std::collections::HashMap; use std::convert::{TryFrom, TryInto}; use std::net::{IpAddr, Ipv4Addr, Ipv6Addr}; use std::str::FromStr; @@ -188,19 +188,19 @@ impl VirtualDns { fn allocate_ip(&mut self, name: String) -> Option { let now = Instant::now(); - // Building the to_remove list seems to be a bit clunky. - // But removing inside the loop does not immediately work due to borrow rules. - // TODO: Is there a better solution? - let mut to_remove = LinkedList::::new(); - for (ip, entry) in self.lru_cache.iter() { + loop { + let p = self.lru_cache.iter().next(); + if p.is_none() { + break; + } + let (ip, entry) = p.unwrap(); if now > entry.expiry { - to_remove.push_back(*ip); - self.name_to_ip.remove(&entry.name); + let name = entry.name.clone(); + self.lru_cache.remove(&ip.clone()); + self.name_to_ip.remove(&name); continue; } - } - for ip in to_remove { - self.lru_cache.remove(&ip); + break; } if let Some(ip) = self.name_to_ip.get(&name) {