Merge pull request #458 from hyperium/server-spawn
fix(server): join on thread when Listening drops
This commit is contained in:
		| @@ -107,7 +107,7 @@ S: NetworkStream + Clone + Send> Server<'a, H, L> { | |||||||
|         let guard = thread::spawn(move || pool.accept(work, threads)); |         let guard = thread::spawn(move || pool.accept(work, threads)); | ||||||
|  |  | ||||||
|         Ok(Listening { |         Ok(Listening { | ||||||
|             _guard: guard, |             _guard: Some(guard), | ||||||
|             socket: socket, |             socket: socket, | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
| @@ -176,16 +176,23 @@ where S: NetworkStream + Clone, H: Handler { | |||||||
| /// A listening server, which can later be closed. | /// A listening server, which can later be closed. | ||||||
| pub struct Listening { | pub struct Listening { | ||||||
|     #[cfg(feature = "nightly")] |     #[cfg(feature = "nightly")] | ||||||
|     _guard: JoinHandle<()>, |     _guard: Option<JoinHandle<()>>, | ||||||
|     #[cfg(not(feature = "nightly"))] |     #[cfg(not(feature = "nightly"))] | ||||||
|     _guard: JoinHandle, |     _guard: Option<JoinHandle>, | ||||||
|     /// The socket addresses that the server is bound to. |     /// The socket addresses that the server is bound to. | ||||||
|     pub socket: SocketAddr, |     pub socket: SocketAddr, | ||||||
| } | } | ||||||
|  |  | ||||||
|  | impl Drop for Listening { | ||||||
|  |     fn drop(&mut self) { | ||||||
|  |         let _ = self._guard.take().map(|g| g.join()); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| impl Listening { | impl Listening { | ||||||
|     /// Stop the server from listening to its socket address. |     /// Stop the server from listening to its socket address. | ||||||
|     pub fn close(&mut self) -> HttpResult<()> { |     pub fn close(&mut self) -> HttpResult<()> { | ||||||
|  |         let _ = self._guard.take(); | ||||||
|         debug!("closing server"); |         debug!("closing server"); | ||||||
|         //try!(self.acceptor.close()); |         //try!(self.acceptor.close()); | ||||||
|         Ok(()) |         Ok(()) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user