From 68d4d63c2a0289b72ec1442d13e1212a0479c50b Mon Sep 17 00:00:00 2001 From: Sean McArthur Date: Wed, 15 Apr 2015 16:27:43 -0700 Subject: [PATCH] fix(server): join on thread when Listening drops Closes #447 --- src/server/mod.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/server/mod.rs b/src/server/mod.rs index f660f5a177..839509272b 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -107,7 +107,7 @@ S: NetworkStream + Clone + Send> Server<'a, H, L> { let guard = thread::spawn(move || pool.accept(work, threads)); Ok(Listening { - _guard: guard, + _guard: Some(guard), socket: socket, }) } @@ -176,16 +176,23 @@ where S: NetworkStream + Clone, H: Handler { /// A listening server, which can later be closed. pub struct Listening { #[cfg(feature = "nightly")] - _guard: JoinHandle<()>, + _guard: Option>, #[cfg(not(feature = "nightly"))] - _guard: JoinHandle, + _guard: Option, /// The socket addresses that the server is bound to. pub socket: SocketAddr, } +impl Drop for Listening { + fn drop(&mut self) { + let _ = self._guard.take().map(|g| g.join()); + } +} + impl Listening { /// Stop the server from listening to its socket address. pub fn close(&mut self) -> HttpResult<()> { + let _ = self._guard.take(); debug!("closing server"); //try!(self.acceptor.close()); Ok(())