Merge pull request #204 from aatxe/master
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() { | ||||
|     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"); | ||||
|     listening.await(); | ||||
| } | ||||
|   | ||||
| @@ -3,7 +3,7 @@ use std::io::{Listener, EndOfFile, BufferedReader, BufferedWriter}; | ||||
| use std::io::net::ip::{IpAddr, Port, SocketAddr}; | ||||
| use std::os; | ||||
| use std::sync::{Arc, TaskPool}; | ||||
| use std::thread::Builder; | ||||
| use std::thread::{Builder, JoinGuard}; | ||||
|  | ||||
|  | ||||
| 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 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); | ||||
|             debug!("threads = {}", 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 { | ||||
|             acceptor: acceptor, | ||||
|             guard: Some(guard), | ||||
|             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. | ||||
| pub struct Listening<A = HttpAcceptor> { | ||||
|     acceptor: A, | ||||
|     guard: Option<JoinGuard<()>>, | ||||
|     /// The socket addresses that the server is bound to. | ||||
|     pub socket: SocketAddr, | ||||
| } | ||||
|  | ||||
| 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. | ||||
|     pub fn close(&mut self) -> HttpResult<()> { | ||||
|         debug!("closing server"); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user