summaryrefslogtreecommitdiffstats
path: root/src/network/dns_queue.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/dns_queue.rs')
-rw-r--r--src/network/dns_queue.rs36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/network/dns_queue.rs b/src/network/dns_queue.rs
new file mode 100644
index 0000000..93728e8
--- /dev/null
+++ b/src/network/dns_queue.rs
@@ -0,0 +1,36 @@
+
+use ::std::net::Ipv4Addr;
+
+use ::std::mem::swap;
+use ::std::sync::{Mutex, Condvar};
+
+pub struct DnsQueue {
+ jobs: Mutex<Vec<Ipv4Addr>>,
+ cvar: Condvar
+}
+
+impl DnsQueue {
+ pub fn new() -> Self {
+ DnsQueue {
+ jobs: Mutex::new(Vec::new()),
+ cvar: Condvar::new()
+ }
+ }
+}
+
+impl DnsQueue {
+ pub fn add_ips_to_resolve(&self, unresolved_ips: Vec<Ipv4Addr>) {
+ let mut queue = self.jobs.lock().unwrap();
+ queue.append(&mut unresolved_ips.into_iter().collect());
+ self.cvar.notify_all();
+ }
+ pub fn wait_for_jobs(&self) -> Vec<Ipv4Addr> {
+ let mut jobs = self.cvar.wait(self.jobs.lock().unwrap()).unwrap();
+ let mut new_jobs = Vec::new();
+ swap(&mut new_jobs, &mut jobs);
+ new_jobs
+ }
+ pub fn end(&self) {
+ self.cvar.notify_all();
+ }
+}