summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-02-20 15:52:02 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-02-24 12:45:10 +0000
commit4369b6a98f3f4fd632a3d66175e6eb005d7396dd (patch)
tree2280cdda2f5cb2c4d89ce6af6335d1e3622c5b52
parenta71c3dd858f85df41437d028f3f29580b7c5149f (diff)
downloadmullvadvpn-4369b6a98f3f4fd632a3d66175e6eb005d7396dd.tar.xz
mullvadvpn-4369b6a98f3f4fd632a3d66175e6eb005d7396dd.zip
Make daemon stop on `DaemonCommandSender` drop
-rw-r--r--mullvad-daemon/src/lib.rs44
1 files changed, 25 insertions, 19 deletions
diff --git a/mullvad-daemon/src/lib.rs b/mullvad-daemon/src/lib.rs
index b40264f9a8..ac8ae23e06 100644
--- a/mullvad-daemon/src/lib.rs
+++ b/mullvad-daemon/src/lib.rs
@@ -47,12 +47,12 @@ use std::{
marker::PhantomData,
mem,
path::PathBuf,
- sync::{mpsc, Arc},
+ sync::{mpsc, Arc, Weak},
thread,
time::Duration,
};
use talpid_core::{
- mpsc::{IntoSender, Sender},
+ mpsc::Sender,
tunnel_state_machine::{self, TunnelCommand, TunnelParametersGenerator},
};
#[cfg(target_os = "android")]
@@ -304,20 +304,18 @@ impl DaemonExecutionState {
}
}
-pub struct DaemonCommandSender(IntoSender<DaemonCommand, InternalDaemonEvent>);
+pub struct DaemonCommandSender(Arc<UnboundedSender<InternalDaemonEvent>>);
impl DaemonCommandSender {
- pub(crate) fn new(internal_event_sender: UnboundedSender<InternalDaemonEvent>) -> Self {
- DaemonCommandSender(IntoSender::from(internal_event_sender))
- }
-
pub fn send(&self, command: DaemonCommand) -> Result<(), Error> {
- self.0.send(command).map_err(|_| Error::DaemonUnavailable)
+ self.0
+ .unbounded_send(InternalDaemonEvent::Command(command))
+ .map_err(|_| Error::DaemonUnavailable)
}
}
pub(crate) struct DaemonEventSender<E = InternalDaemonEvent> {
- sender: UnboundedSender<InternalDaemonEvent>,
+ sender: Weak<UnboundedSender<InternalDaemonEvent>>,
_event: PhantomData<E>,
}
@@ -334,7 +332,7 @@ where
}
impl DaemonEventSender {
- pub fn new(sender: UnboundedSender<InternalDaemonEvent>) -> Self {
+ pub fn new(sender: Weak<UnboundedSender<InternalDaemonEvent>>) -> Self {
DaemonEventSender {
sender,
_event: PhantomData,
@@ -357,7 +355,10 @@ where
InternalDaemonEvent: From<E>,
{
pub fn is_closed(&self) -> bool {
- self.sender.is_closed()
+ self.sender
+ .upgrade()
+ .map(|sender| sender.is_closed())
+ .unwrap_or(true)
}
}
@@ -366,9 +367,13 @@ where
InternalDaemonEvent: From<E>,
{
fn send(&self, event: E) -> Result<(), ()> {
- self.sender
- .unbounded_send(InternalDaemonEvent::from(event))
- .map_err(|_| ())
+ if let Some(sender) = self.sender.upgrade() {
+ sender
+ .unbounded_send(InternalDaemonEvent::from(event))
+ .map_err(|_| ())
+ } else {
+ Err(())
+ }
}
}
@@ -426,8 +431,9 @@ impl Daemon<ManagementInterfaceEventBroadcaster> {
return Err(Error::DaemonIsAlreadyRunning);
}
let (tx, rx) = futures::sync::mpsc::unbounded();
- let command_sender = DaemonCommandSender::new(tx.clone());
- let event_sender = DaemonEventSender::new(tx);
+ let active_tx = Arc::new(tx);
+ let event_sender = DaemonEventSender::new(Arc::downgrade(&active_tx));
+ let command_sender = DaemonCommandSender(active_tx);
let management_interface_broadcaster =
Self::start_management_interface(command_sender, event_sender.clone())?;
@@ -489,8 +495,8 @@ where
#[cfg(target_os = "android")] android_context: AndroidContext,
) -> Result<(Self, DaemonCommandSender), Error> {
let (tx, rx) = futures::sync::mpsc::unbounded();
- let command_sender = DaemonCommandSender::new(tx.clone());
- let event_sender = DaemonEventSender::new(tx);
+ let command_sender = Arc::new(tx);
+ let event_sender = DaemonEventSender::new(Arc::downgrade(&command_sender));
let daemon = Self::start_internal(
event_sender,
@@ -503,7 +509,7 @@ where
android_context,
)?;
- Ok((daemon, command_sender))
+ Ok((daemon, DaemonCommandSender(command_sender)))
}
fn start_internal(