From 7cf5ac80c8ba60d7a53cfe9b134e8136dc6bc41c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Sommer?= Date: Tue, 22 Jan 2019 10:36:04 +0100 Subject: [PATCH] Make ruma client thread safe The new tokio engine requires a client that is safe to be send between threads. It's simply done by converting Rc to Arc and RefCell to Mutex. --- src/lib.rs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 41b2eb16..5be158c2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,7 +4,7 @@ #![deny(missing_docs)] #![feature(try_from)] -use std::{cell::RefCell, convert::TryInto, rc::Rc, str::FromStr}; +use std::{convert::TryInto, str::FromStr, sync::{Arc, Mutex}}; use futures::{ future::{Future, FutureFrom, IntoFuture}, @@ -30,7 +30,7 @@ mod session; /// A client for the Matrix client-server API. #[derive(Debug)] -pub struct Client(Rc>); +pub struct Client(Arc>); /// Data contained in Client's Rc #[derive(Debug)] @@ -40,16 +40,16 @@ where { homeserver_url: Url, hyper: HyperClient, - session: RefCell>, + session: Mutex>, } impl Client { /// Creates a new client for making HTTP requests to the given homeserver. pub fn new(homeserver_url: Url, session: Option) -> Self { - Client(Rc::new(ClientData { + Client(Arc::new(ClientData { homeserver_url, hyper: HyperClient::builder().keep_alive(true).build_http(), - session: RefCell::new(session), + session: Mutex::new(session), })) } } @@ -60,10 +60,10 @@ impl Client> { pub fn https(homeserver_url: Url, session: Option) -> Result { let connector = HttpsConnector::new(4)?; - Ok(Client(Rc::new(ClientData { + Ok(Client(Arc::new(ClientData { homeserver_url, hyper: { HyperClient::builder().keep_alive(true).build(connector) }, - session: RefCell::new(session), + session: Mutex::new(session), }))) } } @@ -80,10 +80,10 @@ where homeserver_url: Url, session: Option, ) -> Self { - Client(Rc::new(ClientData { + Client(Arc::new(ClientData { homeserver_url, hyper: hyper_client, - session: RefCell::new(session), + session: Mutex::new(session), })) } @@ -115,7 +115,7 @@ where ) .map(move |response| { let session = Session::new(response.access_token, response.user_id, response.device_id); - *data.session.borrow_mut() = Some(session.clone()); + *data.session.lock().unwrap() = Some(session.clone()); session }) @@ -143,7 +143,7 @@ where ) .map(move |response| { let session = Session::new(response.access_token, response.user_id, response.device_id); - *data.session.borrow_mut() = Some(session.clone()); + *data.session.lock().unwrap() = Some(session.clone()); session }) @@ -180,7 +180,7 @@ where ) .map(move |response| { let session = Session::new(response.access_token, response.user_id, response.device_id); - *data.session.borrow_mut() = Some(session.clone()); + *data.session.lock().unwrap() = Some(session.clone()); session }) @@ -250,7 +250,7 @@ where url.set_query(uri.query()); if E::METADATA.requires_authentication { - if let Some(ref session) = *data1.session.borrow() { + if let Some(ref session) = *data1.session.lock().unwrap() { url.query_pairs_mut() .append_pair("access_token", session.access_token()); } else {