diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2018-07-09 15:52:23 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2018-07-13 08:26:51 -0300 |
| commit | dbc0fb673b6c4f955097bbbc700fa10f288e4338 (patch) | |
| tree | a0c7e07ac7cfe0699ccc7ee842165a1614bc6d7d | |
| parent | d248d7f7772f29249c8ffcfa393af271b41bb16a (diff) | |
| download | mullvadvpn-dbc0fb673b6c4f955097bbbc700fa10f288e4338.tar.xz mullvadvpn-dbc0fb673b6c4f955097bbbc700fa10f288e4338.zip | |
Keep relays in an `Arc<Mutex<ParsedRelays>>`
| -rw-r--r-- | mullvad-daemon/src/main.rs | 6 | ||||
| -rw-r--r-- | mullvad-daemon/src/relays.rs | 19 |
2 files changed, 14 insertions, 11 deletions
diff --git a/mullvad-daemon/src/main.rs b/mullvad-daemon/src/main.rs index 61c9f84f02..efc2da7632 100644 --- a/mullvad-daemon/src/main.rs +++ b/mullvad-daemon/src/main.rs @@ -465,11 +465,7 @@ impl Daemon { } fn on_get_relay_locations(&mut self, tx: OneshotSender<RelayList>) { - Self::oneshot_send( - tx, - self.relay_selector.get_locations().clone(), - "relay locations", - ); + Self::oneshot_send(tx, self.relay_selector.get_locations(), "relay locations"); } diff --git a/mullvad-daemon/src/relays.rs b/mullvad-daemon/src/relays.rs index 4267587f98..707babb58c 100644 --- a/mullvad-daemon/src/relays.rs +++ b/mullvad-daemon/src/relays.rs @@ -17,6 +17,7 @@ use std::fs::File; use std::io; use std::net::IpAddr; use std::path::{Path, PathBuf}; +use std::sync::{Arc, Mutex, MutexGuard}; use std::time::{self, Duration, SystemTime}; use rand::distributions::{IndependentSample, Range}; @@ -90,7 +91,7 @@ impl ParsedRelays { } pub struct RelaySelector { - parsed_relays: ParsedRelays, + parsed_relays: Arc<Mutex<ParsedRelays>>, last_updated: SystemTime, rng: ThreadRng, rpc_client: RelayListProxy<HttpHandle>, @@ -117,7 +118,7 @@ impl RelaySelector { DateTime::<Local>::from(last_updated).format(::logging::DATE_TIME_FORMAT_STR) ); RelaySelector { - parsed_relays, + parsed_relays: Arc::new(Mutex::new(parsed_relays)), last_updated, rng: rand::thread_rng(), rpc_client: RelayListProxy::new(rpc_handle), @@ -127,8 +128,14 @@ impl RelaySelector { /// Returns all countries and cities. The cities in the object returned does not have any /// relays in them. - pub fn get_locations(&mut self) -> &RelayList { - self.parsed_relays.locations() + pub fn get_locations(&mut self) -> RelayList { + self.lock_parsed_relays().locations().clone() + } + + fn lock_parsed_relays(&self) -> MutexGuard<ParsedRelays> { + self.parsed_relays + .lock() + .expect("Relay updater thread crashed while it held a lock to the list of relays") } /// Returns the time when the relay list backing this selector was last fetched from the @@ -185,7 +192,7 @@ impl RelaySelector { constraints: &RelayConstraints, ) -> Option<(Relay, TunnelEndpoint)> { let matching_relays: Vec<Relay> = self - .parsed_relays + .lock_parsed_relays() .relays() .iter() .filter_map(|relay| Self::matching_relay(relay, constraints)) @@ -317,7 +324,7 @@ impl RelaySelector { parsed_relays.relays().len() ); self.last_updated = SystemTime::now(); - self.parsed_relays = parsed_relays; + *self.lock_parsed_relays() = parsed_relays; Ok(()) } |
