summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2019-10-28 23:37:27 +0100
committerAram Drevekenin <aram@poor.dev>2019-10-28 23:37:27 +0100
commitdb0f4d109403da54574a6469fe676f167c97e2c6 (patch)
tree0c6a92dbd5daa1abcfe58718dfe82073144c4664
parent20085c848166d812b491ee2d585d635a9cc0d7ed (diff)
refactor(dns-queue): support potential multithreading of subscriber
-rw-r--r--src/network/dns_queue.rs21
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();
}
}