From 2d9964293e3ebbd5f0713261de05e0b055f2463a Mon Sep 17 00:00:00 2001 From: Adam Wright Date: Sat, 9 Jan 2016 03:57:46 -0800 Subject: [PATCH] Implement drop for tarpc::Client --- src/lib.rs | 30 +++++++++++++++++++----------- src/macros/src/lib.rs | 3 ++- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 6d45428..3c3135d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -206,16 +206,20 @@ struct SyncedClientState { stream: TcpStream, } -pub struct Client { +pub struct Client + where Request: serde::ser::Serialize +{ synced_state: Mutex, requests: Arc>>>, - reader_guard: thread::JoinHandle<()>, + reader_guard: Option>, + _request: std::marker::PhantomData, } -impl Client - where Reply: serde::de::Deserialize + Send + 'static +impl Client + where Reply: serde::de::Deserialize + Send + 'static, + Request: serde::ser::Serialize { - pub fn new(stream: TcpStream) -> Result { + pub fn new(stream: TcpStream) -> io::Result { let requests = Arc::new(Mutex::new(HashMap::new())); let reader_stream = try!(stream.try_clone()); let reader_requests = requests.clone(); @@ -227,11 +231,12 @@ impl Client stream: stream, }), requests: requests, - reader_guard: reader_guard, + reader_guard: Some(reader_guard), + _request: std::marker::PhantomData, }) } - pub fn rpc(&self, request: &Request) -> Result + pub fn rpc(&self, request: &Request) -> Result where Request: serde::ser::Serialize + Send + 'static { let (tx, rx) = channel(); @@ -246,15 +251,18 @@ impl Client drop(state); Ok(rx.recv().unwrap()) } +} - pub fn disconnect(self) -> Result<()> { +impl Drop for Client + where Request: serde::ser::Serialize +{ + fn drop(&mut self) { { let mut state = self.synced_state.lock().unwrap(); let packet: Packet = Packet::Shutdown; - try!(serde_json::to_writer(&mut state.stream, &packet)); + serde_json::to_writer(&mut state.stream, &packet); } - self.reader_guard.join().unwrap(); - Ok(()) + self.reader_guard.take().unwrap().join().unwrap(); } } diff --git a/src/macros/src/lib.rs b/src/macros/src/lib.rs index e98997d..1a45e14 100644 --- a/src/macros/src/lib.rs +++ b/src/macros/src/lib.rs @@ -64,7 +64,7 @@ macro_rules! rpc_service { )* } - pub struct Client(tarpc::Client); + pub struct Client(tarpc::Client); impl Client { pub fn new(addr: A) -> Result @@ -146,6 +146,7 @@ mod test { let foo = Foo{message: "Adam".into()}; let want = Foo{message: format!("Hello, {}", &foo.message)}; assert_eq!(want, client.hello(Foo{message: "Adam".into()}).unwrap()); + drop(client); shutdown.shutdown(); } }