summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-06-14 18:57:41 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-06-18 17:25:15 +0000
commitd3858d019f0c627eaf3f7641eb236939d8a7cafa (patch)
tree909fa90571fbb79d6bfc5f7e74e94229d32b1de7
parent1f9cac7a2418138d1c1138a5816cffd8df6ebe55 (diff)
downloadmullvadvpn-d3858d019f0c627eaf3f7641eb236939d8a7cafa.tar.xz
mullvadvpn-d3858d019f0c627eaf3f7641eb236939d8a7cafa.zip
Refactor daemon interface locks
Reduce the amount of time threads are blocked.
-rw-r--r--mullvad-jni/src/daemon_interface.rs14
-rw-r--r--mullvad-jni/src/lib.rs52
2 files changed, 23 insertions, 43 deletions
diff --git a/mullvad-jni/src/daemon_interface.rs b/mullvad-jni/src/daemon_interface.rs
index 1565a9fd0d..e91885fc95 100644
--- a/mullvad-jni/src/daemon_interface.rs
+++ b/mullvad-jni/src/daemon_interface.rs
@@ -4,6 +4,7 @@ use mullvad_types::{
account::AccountData, location::GeoIpLocation, relay_constraints::RelaySettingsUpdate,
relay_list::RelayList, settings::Settings, states::TargetState,
};
+use parking_lot::Mutex;
use talpid_types::{net::wireguard, tunnel::TunnelStateTransition};
#[derive(Debug, err_derive::Error)]
@@ -24,18 +25,20 @@ pub enum Error {
type Result<T> = std::result::Result<T, Error>;
pub struct DaemonInterface {
- command_sender: Option<DaemonCommandSender>,
+ command_sender: Mutex<Option<DaemonCommandSender>>,
}
impl DaemonInterface {
pub fn new() -> Self {
DaemonInterface {
- command_sender: None,
+ command_sender: Mutex::new(None),
}
}
- pub fn set_command_sender(&mut self, sender: DaemonCommandSender) {
- self.command_sender = Some(sender);
+ pub fn set_command_sender(&self, sender: DaemonCommandSender) {
+ let mut command_sender = self.command_sender.lock();
+
+ *command_sender = Some(sender);
}
pub fn connect(&self) -> Result<()> {
@@ -139,7 +142,8 @@ impl DaemonInterface {
}
fn send_command(&self, command: ManagementCommand) -> Result<()> {
- let sender = self.command_sender.as_ref().ok_or(Error::NoSender)?;
+ let locked_sender = self.command_sender.lock();
+ let sender = locked_sender.as_ref().ok_or(Error::NoSender)?;
sender.send(command).map_err(Error::NoDaemon)
}
diff --git a/mullvad-jni/src/lib.rs b/mullvad-jni/src/lib.rs
index d17fc13bd5..276d49af4d 100644
--- a/mullvad-jni/src/lib.rs
+++ b/mullvad-jni/src/lib.rs
@@ -18,7 +18,7 @@ use jni::{
};
use lazy_static::lazy_static;
use mullvad_daemon::{logging, version, Daemon, DaemonCommandSender};
-use parking_lot::{Mutex, RwLock};
+use parking_lot::RwLock;
use std::{collections::HashMap, path::PathBuf, sync::mpsc, thread};
use talpid_types::ErrorExt;
@@ -56,7 +56,7 @@ const CLASSES_TO_LOAD: &[&str] = &[
];
lazy_static! {
- static ref DAEMON_INTERFACE: Mutex<DaemonInterface> = Mutex::new(DaemonInterface::new());
+ static ref DAEMON_INTERFACE: DaemonInterface = DaemonInterface::new();
static ref CLASSES: RwLock<HashMap<&'static str, GlobalRef>> =
RwLock::new(HashMap::with_capacity(CLASSES_TO_LOAD.len()));
}
@@ -131,9 +131,7 @@ fn initialize(
VpnServiceTunProvider::new(env, vpn_service).map_err(Error::CreateVpnServiceTunProvider)?;
let daemon_command_sender = spawn_daemon(env, this, tun_provider, log_dir)?;
- DAEMON_INTERFACE
- .lock()
- .set_command_sender(daemon_command_sender);
+ DAEMON_INTERFACE.set_command_sender(daemon_command_sender);
Ok(())
}
@@ -196,9 +194,7 @@ fn get_class(name: &str) -> GlobalRef {
#[no_mangle]
#[allow(non_snake_case)]
pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_connect(_: JNIEnv, _: JObject) {
- let daemon = DAEMON_INTERFACE.lock();
-
- if let Err(error) = daemon.connect() {
+ if let Err(error) = DAEMON_INTERFACE.connect() {
log::error!(
"{}",
error.display_chain_with_msg("Failed to request daemon to connect")
@@ -209,9 +205,7 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_connect(_: JNIE
#[no_mangle]
#[allow(non_snake_case)]
pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_disconnect(_: JNIEnv, _: JObject) {
- let daemon = DAEMON_INTERFACE.lock();
-
- if let Err(error) = daemon.disconnect() {
+ if let Err(error) = DAEMON_INTERFACE.disconnect() {
log::error!(
"{}",
error.display_chain_with_msg("Failed to request daemon to disconnect")
@@ -225,9 +219,7 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_generateWiregua
_: JNIEnv,
_: JObject,
) -> jboolean {
- let daemon = DAEMON_INTERFACE.lock();
-
- match daemon.generate_wireguard_key() {
+ match DAEMON_INTERFACE.generate_wireguard_key() {
Ok(()) => JNI_TRUE,
Err(error) => {
log::error!(
@@ -246,11 +238,9 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_getAccountData<
_: JObject<'this>,
accountToken: JString,
) -> JObject<'env> {
- let daemon = DAEMON_INTERFACE.lock();
-
let account = String::from_java(&env, accountToken);
- match daemon.get_account_data(account) {
+ match DAEMON_INTERFACE.get_account_data(account) {
Ok(data) => data.into_java(&env),
Err(error) => {
log::error!(
@@ -268,9 +258,7 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_getCurrentLocat
env: JNIEnv<'env>,
_: JObject<'this>,
) -> JObject<'env> {
- let daemon = DAEMON_INTERFACE.lock();
-
- match daemon.get_current_location() {
+ match DAEMON_INTERFACE.get_current_location() {
Ok(location) => location.into_java(&env),
Err(error) => {
log::error!(
@@ -288,9 +276,7 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_getRelayLocatio
env: JNIEnv<'env>,
_: JObject<'this>,
) -> JObject<'env> {
- let daemon = DAEMON_INTERFACE.lock();
-
- match daemon.get_relay_locations() {
+ match DAEMON_INTERFACE.get_relay_locations() {
Ok(relay_list) => relay_list.into_java(&env),
Err(error) => {
log::error!(
@@ -308,9 +294,7 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_getSettings<'en
env: JNIEnv<'env>,
_: JObject<'this>,
) -> JObject<'env> {
- let daemon = DAEMON_INTERFACE.lock();
-
- match daemon.get_settings() {
+ match DAEMON_INTERFACE.get_settings() {
Ok(settings) => settings.into_java(&env),
Err(error) => {
log::error!("{}", error.display_chain_with_msg("Failed to get settings"));
@@ -325,9 +309,7 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_getState<'env,
env: JNIEnv<'env>,
_: JObject<'this>,
) -> JObject<'env> {
- let daemon = DAEMON_INTERFACE.lock();
-
- match daemon.get_state() {
+ match DAEMON_INTERFACE.get_state() {
Ok(state) => state.into_java(&env),
Err(error) => {
log::error!("{}", error.display_chain_with_msg("Failed to get state"));
@@ -342,9 +324,7 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_getWireguardKey
env: JNIEnv<'env>,
_: JObject<'this>,
) -> JObject<'env> {
- let daemon = DAEMON_INTERFACE.lock();
-
- match daemon.get_wireguard_key() {
+ match DAEMON_INTERFACE.get_wireguard_key() {
Ok(public_key) => public_key.into_java(&env),
Err(error) => {
log::error!(
@@ -363,11 +343,9 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_setAccount(
_: JObject,
accountToken: JString,
) {
- let daemon = DAEMON_INTERFACE.lock();
-
let account = <Option<String> as FromJava>::from_java(&env, accountToken);
- if let Err(error) = daemon.set_account(account) {
+ if let Err(error) = DAEMON_INTERFACE.set_account(account) {
log::error!("{}", error.display_chain_with_msg("Failed to set account"));
}
}
@@ -379,11 +357,9 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_updateRelaySett
_: JObject,
relaySettingsUpdate: JObject,
) {
- let daemon = DAEMON_INTERFACE.lock();
-
let update = FromJava::from_java(&env, relaySettingsUpdate);
- if let Err(error) = daemon.update_relay_settings(update) {
+ if let Err(error) = DAEMON_INTERFACE.update_relay_settings(update) {
log::error!(
"{}",
error.display_chain_with_msg("Failed to update relay settings")