diff options
author | Aram Drevekenin <aram@poor.dev> | 2019-10-28 23:37:27 +0100 |
---|---|---|
committer | Aram Drevekenin <aram@poor.dev> | 2019-10-28 23:37:27 +0100 |
commit | db0f4d109403da54574a6469fe676f167c97e2c6 (patch) | |
tree | 0c6a92dbd5daa1abcfe58718dfe82073144c4664 | |
parent | 20085c848166d812b491ee2d585d635a9cc0d7ed (diff) |
refactor(dns-queue): support potential multithreading of subscriber
-rw-r--r-- | src/network/dns_queue.rs | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/src/network/dns_queue.rs b/src/network/dns_queue.rs index c86f003..c7de950 100644 --- a/src/network/dns_queue.rs +++ b/src/network/dns_queue.rs @@ -3,14 +3,14 @@ use ::std::net::Ipv4Addr; use ::std::sync::{Condvar, Mutex}; pub struct DnsQueue { - jobs: Mutex<VecDeque<Option<Ipv4Addr>>>, + jobs: Mutex<Option<VecDeque<Ipv4Addr>>>, cvar: Condvar, } impl DnsQueue { pub fn new() -> Self { DnsQueue { - jobs: Mutex::new(VecDeque::new()), + jobs: Mutex::new(Some(VecDeque::new())), cvar: Condvar::new(), } } @@ -18,27 +18,26 @@ impl DnsQueue { impl DnsQueue { pub fn resolve_ips(&self, unresolved_ips: Vec<Ipv4Addr>) { - let mut queue = self.jobs.lock().unwrap(); - for ip in unresolved_ips { - queue.push_back(Some(ip)) + let mut jobs = self.jobs.lock().unwrap(); + if let Some(queue) = jobs.as_mut() { + queue.extend(unresolved_ips); + self.cvar.notify_all(); } - self.cvar.notify_all(); } pub fn wait_for_job(&self) -> Option<Ipv4Addr> { let mut jobs = self.jobs.lock().unwrap(); loop { - match jobs.pop_front() { - Some(job) => return job, + match jobs.as_mut()?.pop_front() { + Some(job) => return Some(job), None => { - jobs = self.cvar.wait(jobs).unwrap(); + jobs = self.cvar.wait(jobs).unwrap() } } } } pub fn end(&self) { let mut jobs = self.jobs.lock().unwrap(); - jobs.clear(); - jobs.push_back(None); + *jobs = None; self.cvar.notify_all(); } } |