diff options
| author | David Lönnhager <david.l@mullvad.net> | 2024-11-19 18:17:06 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2024-11-22 13:38:22 +0100 |
| commit | 168c9afb19e9bec61b40ecfb5ab12ed7983f35e0 (patch) | |
| tree | ee9dfd5c1fa6b515cf97acd5b2d03bb61de50e56 /talpid-core/src | |
| parent | f4db85b3a552f60d2454bfa69912c7ced51b41b1 (diff) | |
| download | mullvadvpn-168c9afb19e9bec61b40ecfb5ab12ed7983f35e0.tar.xz mullvadvpn-168c9afb19e9bec61b40ecfb5ab12ed7983f35e0.zip | |
Simplify ConnectivityListener
Diffstat (limited to 'talpid-core/src')
| -rw-r--r-- | talpid-core/src/connectivity_listener.rs | 47 |
1 files changed, 20 insertions, 27 deletions
diff --git a/talpid-core/src/connectivity_listener.rs b/talpid-core/src/connectivity_listener.rs index b28f58cefb..2d121d264b 100644 --- a/talpid-core/src/connectivity_listener.rs +++ b/talpid-core/src/connectivity_listener.rs @@ -9,10 +9,9 @@ use jnix::{ sys::{jboolean, jlong, JNI_TRUE}, JNIEnv, JavaVM, }, - JnixEnv, - FromJava, + FromJava, JnixEnv, }; -use std::{net::IpAddr, sync::{Arc, Weak}}; +use std::{net::IpAddr, sync::Arc}; use talpid_types::{android::AndroidContext, net::Connectivity, ErrorExt}; /// Error related to Android connectivity monitor @@ -45,7 +44,6 @@ pub struct ConnectivityListener { jvm: Arc<JavaVM>, class: GlobalRef, object: GlobalRef, - _sender: Option<Arc<UnboundedSender<Connectivity>>>, } impl ConnectivityListener { @@ -96,26 +94,24 @@ impl ConnectivityListener { jvm: android_context.jvm, class, object, - _sender: None, }) } /// Register a channel that receives changes about the offline state + /// + /// # Note + /// + /// The listener is shared by all instances of the struct. pub fn set_connectivity_listener( &mut self, sender: UnboundedSender<Connectivity>, ) -> Result<(), Error> { - let sender = Arc::new(sender); - - let weak_sender = Arc::downgrade(&sender); - - let weak_sender_ptr = Box::new(weak_sender); - let weak_sender_address = Box::into_raw(weak_sender_ptr) as jlong; + let sender_ptr = Box::into_raw(Box::new(sender)) as jlong; let result = self.call_method( "setSenderAddress", "(J)V", - &[JValue::Long(weak_sender_address)], + &[JValue::Long(sender_ptr)], JavaType::Primitive(Primitive::Void), )?; @@ -128,8 +124,6 @@ impl ConnectivityListener { )), }?; - self._sender = Some(sender); - Ok(()) } @@ -222,15 +216,18 @@ pub extern "system" fn Java_net_mullvad_talpid_ConnectivityListener_notifyConnec sender_address: jlong, ) { let connected = JNI_TRUE == connected; - let sender_ref = Box::leak(unsafe { get_sender_from_address(sender_address) }); - if let Some(sender) = sender_ref.upgrade() { - if sender - .unbounded_send(Connectivity::Status { connected }) - .is_err() - { - log::warn!("Failed to send offline change event"); - } + + let sender = unsafe { Box::from_raw(sender_address as *mut UnboundedSender<Connectivity>) }; + + if sender + .unbounded_send(Connectivity::Status { connected }) + .is_err() + { + log::warn!("Failed to send offline change event"); } + + // Do not destroy + std::mem::forget(sender); } /// Entry point for Android Java code to return ownership of the sender reference. @@ -241,9 +238,5 @@ pub extern "system" fn Java_net_mullvad_talpid_ConnectivityListener_destroySende _: JObject<'_>, sender_address: jlong, ) { - let _ = unsafe { get_sender_from_address(sender_address) }; -} - -unsafe fn get_sender_from_address(address: jlong) -> Box<Weak<UnboundedSender<Connectivity>>> { - Box::from_raw(address as *mut Weak<UnboundedSender<Connectivity>>) + let _ = unsafe { Box::from_raw(sender_address as *mut UnboundedSender<Connectivity>) }; } |
