Server programs no longer exit immediately.
This commit is contained in:
		| @@ -52,6 +52,7 @@ fn echo(mut req: Request, mut res: Response) { | |||||||
|  |  | ||||||
| fn main() { | fn main() { | ||||||
|     let server = Server::http(Ipv4Addr(127, 0, 0, 1), 1337); |     let server = Server::http(Ipv4Addr(127, 0, 0, 1), 1337); | ||||||
|     server.listen(echo).unwrap(); |     let mut listening = server.listen(echo).unwrap(); | ||||||
|     println!("Listening on http://127.0.0.1:1337"); |     println!("Listening on http://127.0.0.1:1337"); | ||||||
|  |     listening.await(); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ use std::io::{Listener, EndOfFile, BufferedReader, BufferedWriter}; | |||||||
| use std::io::net::ip::{IpAddr, Port, SocketAddr}; | use std::io::net::ip::{IpAddr, Port, SocketAddr}; | ||||||
| use std::os; | use std::os; | ||||||
| use std::sync::{Arc, TaskPool}; | use std::sync::{Arc, TaskPool}; | ||||||
| use std::thread::Builder; | use std::thread::{Builder, JoinGuard}; | ||||||
|  |  | ||||||
|  |  | ||||||
| pub use self::request::Request; | pub use self::request::Request; | ||||||
| @@ -68,7 +68,7 @@ impl<L: NetworkListener<S, A>, S: NetworkStream, A: NetworkAcceptor<S>> Server<L | |||||||
|         let acceptor = try!(listener.listen()); |         let acceptor = try!(listener.listen()); | ||||||
|  |  | ||||||
|         let mut captured = acceptor.clone(); |         let mut captured = acceptor.clone(); | ||||||
|         Builder::new().name("hyper acceptor".into_string()).spawn(move || { |         let guard = Builder::new().name("hyper acceptor".into_string()).spawn(move || { | ||||||
|             let handler = Arc::new(handler); |             let handler = Arc::new(handler); | ||||||
|             debug!("threads = {}", threads); |             debug!("threads = {}", threads); | ||||||
|             let pool = TaskPool::new(threads); |             let pool = TaskPool::new(threads); | ||||||
| @@ -126,10 +126,11 @@ impl<L: NetworkListener<S, A>, S: NetworkStream, A: NetworkAcceptor<S>> Server<L | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         }).detach(); |         }); | ||||||
|  |  | ||||||
|         Ok(Listening { |         Ok(Listening { | ||||||
|             acceptor: acceptor, |             acceptor: acceptor, | ||||||
|  |             guard: Some(guard), | ||||||
|             socket: socket, |             socket: socket, | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
| @@ -149,11 +150,19 @@ impl<L: NetworkListener<S, A>, S: NetworkStream, A: NetworkAcceptor<S>> Server<L | |||||||
| /// A listening server, which can later be closed. | /// A listening server, which can later be closed. | ||||||
| pub struct Listening<A = HttpAcceptor> { | pub struct Listening<A = HttpAcceptor> { | ||||||
|     acceptor: A, |     acceptor: A, | ||||||
|  |     guard: Option<JoinGuard<()>>, | ||||||
|     /// 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<A: NetworkAcceptor<S>, S: NetworkStream> Listening<A> { | impl<A: NetworkAcceptor<S>, S: NetworkStream> Listening<A> { | ||||||
|  |     /// Causes the current thread to wait for this listening to complete. | ||||||
|  |     pub fn await(&mut self) { | ||||||
|  |         if let Some(guard) = self.guard.take() { | ||||||
|  |             let _ = guard.join(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /// 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<()> { | ||||||
|         debug!("closing server"); |         debug!("closing server"); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user