summaryrefslogtreecommitdiffhomepage
path: root/mullvad-daemon/src
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2018-07-09 15:52:23 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2018-07-13 08:26:51 -0300
commitdbc0fb673b6c4f955097bbbc700fa10f288e4338 (patch)
treea0c7e07ac7cfe0699ccc7ee842165a1614bc6d7d /mullvad-daemon/src
parentd248d7f7772f29249c8ffcfa393af271b41bb16a (diff)
downloadmullvadvpn-dbc0fb673b6c4f955097bbbc700fa10f288e4338.tar.xz
mullvadvpn-dbc0fb673b6c4f955097bbbc700fa10f288e4338.zip
Keep relays in an `Arc<Mutex<ParsedRelays>>`
Diffstat (limited to 'mullvad-daemon/src')
-rw-r--r--mullvad-daemon/src/main.rs6
-rw-r--r--mullvad-daemon/src/relays.rs19
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(())
}