diff --git a/components/compositing/constellation.rs b/components/compositing/constellation.rs index 7bbf1ebb5fb..242163908c1 100644 --- a/components/compositing/constellation.rs +++ b/components/compositing/constellation.rs @@ -5,6 +5,7 @@ use pipeline::{Pipeline, CompositionPipeline}; use compositor_task::{CompositorProxy, FrameTreeUpdateMsg, LoadComplete, ShutdownComplete, SetLayerOrigin, SetIds}; +use devtools_traits; use devtools_traits::DevtoolsControlChan; use geom::rect::{Rect, TypedRect}; use geom::scale_factor::ScaleFactor; @@ -460,6 +461,9 @@ impl Constellation { } self.image_cache_task.exit(); self.resource_task.send(resource_task::Exit); + self.devtools_chan.as_ref().map(|chan| { + chan.send(devtools_traits::ServerExitMsg); + }); self.font_cache_task.exit(); self.compositor_proxy.send(ShutdownComplete); } diff --git a/components/devtools/lib.rs b/components/devtools/lib.rs index 6c756237c30..a6e5b78a55f 100644 --- a/components/devtools/lib.rs +++ b/components/devtools/lib.rs @@ -88,6 +88,8 @@ fn run_server(receiver: Receiver, port: u16) { let actors = Arc::new(Mutex::new(registry)); + let mut accepted_connections: Vec = Vec::new(); + /// Process the input from a single devtools client until EOF. fn handle_client(actors: Arc>, mut stream: TcpStream) { println!("connection established to {:?}", stream.peer_name().unwrap()); @@ -178,9 +180,6 @@ fn run_server(receiver: Receiver, port: u16) { // from multiple script tasks simultaneously. Polling for new connections // for 300ms and then checking the receiver is not a good compromise // (and makes Servo hang on exit if there's an open connection, no less). - - //TODO: make constellation send ServerExitMsg on shutdown. - // accept connections and process them, spawning a new tasks for each one loop { match acceptor.accept() { @@ -194,6 +193,7 @@ fn run_server(receiver: Receiver, port: u16) { Err(_e) => { /* connection failed */ } Ok(stream) => { let actors = actors.clone(); + accepted_connections.push(stream.clone()); spawn_named("DevtoolsClientHandler", proc() { // connection succeeded handle_client(actors, stream.clone()) @@ -201,4 +201,9 @@ fn run_server(receiver: Receiver, port: u16) { } } } + + for connection in accepted_connections.iter_mut() { + let _read = connection.close_read(); + let _write = connection.close_write(); + } }