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 | |
| parent | f4db85b3a552f60d2454bfa69912c7ced51b41b1 (diff) | |
| download | mullvadvpn-168c9afb19e9bec61b40ecfb5ab12ed7983f35e0.tar.xz mullvadvpn-168c9afb19e9bec61b40ecfb5ab12ed7983f35e0.zip | |
Simplify ConnectivityListener
| -rw-r--r-- | android/lib/talpid/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt | 13 | ||||
| -rw-r--r-- | mullvad-daemon/src/lib.rs | 1 | ||||
| -rw-r--r-- | talpid-core/src/connectivity_listener.rs | 47 |
3 files changed, 25 insertions, 36 deletions
diff --git a/android/lib/talpid/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt b/android/lib/talpid/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt index c2f0aef20f..f1fe3ca807 100644 --- a/android/lib/talpid/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt +++ b/android/lib/talpid/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt @@ -75,15 +75,12 @@ class ConnectivityListener { fun unregister() { connectivityManager.unregisterNetworkCallback(callback) connectivityManager.unregisterNetworkCallback(defaultNetworkCallback) - } - // DROID-1401 - // This function has never been used and should most likely be merged into unregister(), - // along with ensuring that the lifecycle of it is correct. - @Suppress("UnusedPrivateMember") - private fun finalize() { - destroySender(senderAddress) - senderAddress = 0L + if (senderAddress != 0L) { + var oldSender = senderAddress + senderAddress = 0L + destroySender(oldSender) + } } private external fun notifyConnectivityChange(isConnected: Boolean, senderAddress: Long) diff --git a/mullvad-daemon/src/lib.rs b/mullvad-daemon/src/lib.rs index 0f2914fdff..0665c2736e 100644 --- a/mullvad-daemon/src/lib.rs +++ b/mullvad-daemon/src/lib.rs @@ -622,7 +622,6 @@ impl Daemon { mullvad_api::proxy::ApiConnectionMode::try_delete_cache(&cache_dir).await; let api_runtime = mullvad_api::Runtime::with_cache( - // FIXME: clone is bad (single sender) #[cfg(target_os = "android")] android_dns::AndroidDnsResolver::new(connectivity_listener.clone()), #[cfg(not(target_os = "android"))] 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>) }; } |
