From 9219ac690aafc034417bb0728828a661b7a0eabb Mon Sep 17 00:00:00 2001 From: Nils Andreas Svee Date: Wed, 28 Sep 2022 00:43:48 +0200 Subject: [PATCH] Use a RwLock instead of a Mutex for the peers --- src/main.rs | 8 ++++---- src/pinger.rs | 10 +++++----- src/ratecontroller.rs | 6 +++--- src/reflector_selector.rs | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main.rs b/src/main.rs index 75b55e6..d630243 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,7 +21,7 @@ use std::net::IpAddr; use std::process::ExitCode; use std::str::FromStr; use std::sync::mpsc::channel; -use std::sync::{Arc, Mutex}; +use std::sync::{Arc, Mutex, RwLock}; use std::thread::sleep; use std::time::Duration; use std::{panic, process, thread}; @@ -68,7 +68,7 @@ fn main() -> ExitCode { // Create data structures shared by different threads let owd_baseline = Arc::new(Mutex::new(HashMap::::new())); let owd_recent = Arc::new(Mutex::new(HashMap::::new())); - let reflector_peers_lock = Arc::new(Mutex::new(Vec::::new())); + let reflector_peers_lock = Arc::new(RwLock::new(Vec::::new())); let mut reflector_pool = Vec::::new(); let reflector_pool_size = reflectors.len(); @@ -83,12 +83,12 @@ fn main() -> ExitCode { match reflector_pool_size > 5 { true => { - let mut peers = reflector_peers_lock.lock().unwrap(); + let mut peers = reflector_peers_lock.write().unwrap(); peers.append(default_reflectors.to_vec().as_mut()); reflector_pool.append(reflectors.as_mut()); } false => { - let mut peers = reflector_peers_lock.lock().unwrap(); + let mut peers = reflector_peers_lock.write().unwrap(); peers.append(default_reflectors.to_vec().as_mut()); } } diff --git a/src/pinger.rs b/src/pinger.rs index 760c614..33b4c9c 100644 --- a/src/pinger.rs +++ b/src/pinger.rs @@ -8,7 +8,7 @@ use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddrV4, SocketAddrV6}; use std::os::unix::io::RawFd; use std::str::FromStr; use std::sync::mpsc::Sender; -use std::sync::{Arc, Mutex}; +use std::sync::{Arc, Mutex, RwLock}; use std::thread; use std::time::Duration; @@ -59,7 +59,7 @@ pub trait PingListener { fn listen( &mut self, type_: SocketType, - reflectors_lock: Arc>>, + reflectors_lock: Arc>>, stats_sender: Sender, ) -> Result<(), Box> { let socket = open_socket(type_)?; @@ -80,7 +80,7 @@ pub trait PingListener { let addr_bytes = sender.expect("Should be an address here").ip(); let addr = IpAddr::from(addr_bytes.to_be_bytes()); - let reflectors = reflectors_lock.lock().unwrap(); + let reflectors = reflectors_lock.read().unwrap(); if !reflectors.contains(&addr) { continue; } @@ -112,7 +112,7 @@ pub trait PingSender { fn send( &mut self, type_: SocketType, - reflectors_lock: Arc>>, + reflectors_lock: Arc>>, ) -> Result<(), Box> { let socket = open_socket(type_)?; @@ -121,7 +121,7 @@ pub trait PingSender { let sleep_duration = Duration::from_millis(tick_duration_ms as u64); loop { - let reflectors_unlocked = reflectors_lock.lock().unwrap(); + let reflectors_unlocked = reflectors_lock.read().unwrap(); let reflectors = reflectors_unlocked.clone(); drop(reflectors_unlocked); diff --git a/src/ratecontroller.rs b/src/ratecontroller.rs index 845a44e..1e515e4 100644 --- a/src/ratecontroller.rs +++ b/src/ratecontroller.rs @@ -9,7 +9,7 @@ use std::fs::File; use std::io::Write; use std::net::IpAddr; use std::sync::mpsc::Sender; -use std::sync::{Arc, Mutex}; +use std::sync::{Arc, Mutex, RwLock}; use std::thread::sleep; use std::time::Duration; @@ -65,7 +65,7 @@ pub struct Ratecontroller { pub(crate) config: Config, pub(crate) owd_baseline: Arc>>, pub(crate) owd_recent: Arc>>, - pub(crate) reflectors_lock: Arc>>, + pub(crate) reflectors_lock: Arc>>, pub(crate) reselect_trigger: Sender, } @@ -164,7 +164,7 @@ impl Ratecontroller { // change speeds here let owd_baseline = self.owd_baseline.lock().unwrap(); let owd_recent = self.owd_recent.lock().unwrap(); - let reflectors = self.reflectors_lock.lock().unwrap(); + let reflectors = self.reflectors_lock.read().unwrap(); let mut down_delta_stat: f64; let mut up_delta_stat: f64; diff --git a/src/reflector_selector.rs b/src/reflector_selector.rs index a526e3c..8cb4406 100644 --- a/src/reflector_selector.rs +++ b/src/reflector_selector.rs @@ -5,14 +5,14 @@ use rand::{thread_rng, Rng}; use std::collections::HashMap; use std::net::IpAddr; use std::sync::mpsc::Receiver; -use std::sync::{Arc, Mutex}; +use std::sync::{Arc, Mutex, RwLock}; use std::thread::sleep; use std::time::Duration; pub struct ReflectorSelector { pub(crate) config: Config, pub(crate) owd_recent: Arc>>, - pub(crate) reflector_peers_lock: Arc>>, + pub(crate) reflector_peers_lock: Arc>>, pub(crate) reflector_pool: Vec, pub(crate) trigger_channel: Receiver, } @@ -50,7 +50,7 @@ impl ReflectorSelector { } let mut next_peers: Vec = Vec::new(); - let mut reflectors_peers = self.reflector_peers_lock.lock().unwrap(); + let mut reflectors_peers = self.reflector_peers_lock.write().unwrap(); // Include all current peers for reflector in reflectors_peers.iter() { @@ -76,7 +76,7 @@ impl ReflectorSelector { sleep(baseline_sleep_time); // Re-acquire the lock when we wake up again - reflectors_peers = self.reflector_peers_lock.lock().unwrap(); + reflectors_peers = self.reflector_peers_lock.write().unwrap(); reflectors_peers.len(); let mut candidates = Vec::new();