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