From 06a19f016eb4faaed6d0890ccc434f4ecc925d04 Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Wed, 30 Aug 2023 14:39:26 +0200 Subject: [PATCH] ffi: Only ever call ClientDelegate methods in a blocking task MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit … and clean up a few unnecessary Arc's. --- bindings/matrix-sdk-ffi/src/client.rs | 20 +++++++++---------- bindings/matrix-sdk-ffi/src/client_builder.rs | 4 +--- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/bindings/matrix-sdk-ffi/src/client.rs b/bindings/matrix-sdk-ffi/src/client.rs index d39a8d2ff..42ec0ad9f 100644 --- a/bindings/matrix-sdk-ffi/src/client.rs +++ b/bindings/matrix-sdk-ffi/src/client.rs @@ -134,16 +134,16 @@ impl From for TransmissionProgress { } } -#[derive(Clone, uniffi::Object)] +#[derive(uniffi::Object)] pub struct Client { pub(crate) inner: MatrixClient, - delegate: Arc>>>, + delegate: RwLock>>, session_verification_controller: Arc>>, } impl Client { - pub fn new(sdk_client: MatrixClient) -> Self { + pub fn new(sdk_client: MatrixClient) -> Arc { let session_verification_controller: Arc< tokio::sync::RwLock>, > = Default::default(); @@ -160,11 +160,11 @@ impl Client { } }); - let client = Client { + let client = Arc::new(Client { inner: sdk_client, - delegate: Arc::new(RwLock::new(None)), + delegate: RwLock::new(None), session_verification_controller, - }; + }); let mut session_change_receiver = client.inner.subscribe_to_session_changes(); let client_clone = client.clone(); @@ -356,7 +356,7 @@ impl Client { #[uniffi::export] impl Client { pub fn set_delegate(&self, delegate: Option>) { - *self.delegate.write().unwrap() = delegate; + *self.delegate.write().unwrap() = delegate.map(Arc::from); } pub fn session(&self) -> Result { @@ -763,15 +763,15 @@ impl From<&search_users::v3::User> for UserProfile { impl Client { fn process_session_change(&self, session_change: SessionChange) { - if let Some(delegate) = &*self.delegate.read().unwrap() { - match session_change { + if let Some(delegate) = self.delegate.read().unwrap().clone() { + RUNTIME.spawn_blocking(move || match session_change { SessionChange::UnknownToken { soft_logout } => { delegate.did_receive_auth_error(soft_logout); } SessionChange::TokensRefreshed => { delegate.did_refresh_tokens(); } - } + }); } } } diff --git a/bindings/matrix-sdk-ffi/src/client_builder.rs b/bindings/matrix-sdk-ffi/src/client_builder.rs index 1dc70b975..2cdd89d02 100644 --- a/bindings/matrix-sdk-ffi/src/client_builder.rs +++ b/bindings/matrix-sdk-ffi/src/client_builder.rs @@ -200,9 +200,7 @@ impl ClientBuilder { sdk_client.set_sliding_sync_proxy(Some(Url::parse(&sliding_sync_proxy)?)); } - let client = Client::new(sdk_client); - - Ok(Arc::new(client)) + Ok(Client::new(sdk_client)) } }