servo: Merge #3796 - Servo exit devtools: Send exit message to devtools on browser exit (from shanil-puri:ServoExitDevtools); r=jdm

Source-Repo: https://github.com/servo/servo
Source-Revision: d1eaa3adda5e59cc34822d6d1477b987796dfd62
This commit is contained in:
Shanil Puri 2014-11-17 06:15:30 -07:00
Родитель 757be2eede
Коммит f04b66f021
2 изменённых файлов: 12 добавлений и 3 удалений

Просмотреть файл

@ -5,6 +5,7 @@
use pipeline::{Pipeline, CompositionPipeline}; use pipeline::{Pipeline, CompositionPipeline};
use compositor_task::{CompositorProxy, FrameTreeUpdateMsg, LoadComplete, ShutdownComplete, SetLayerOrigin, SetIds}; use compositor_task::{CompositorProxy, FrameTreeUpdateMsg, LoadComplete, ShutdownComplete, SetLayerOrigin, SetIds};
use devtools_traits;
use devtools_traits::DevtoolsControlChan; use devtools_traits::DevtoolsControlChan;
use geom::rect::{Rect, TypedRect}; use geom::rect::{Rect, TypedRect};
use geom::scale_factor::ScaleFactor; use geom::scale_factor::ScaleFactor;
@ -466,6 +467,9 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
} }
self.image_cache_task.exit(); self.image_cache_task.exit();
self.resource_task.send(resource_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.font_cache_task.exit();
self.compositor_proxy.send(ShutdownComplete); self.compositor_proxy.send(ShutdownComplete);
} }

Просмотреть файл

@ -85,6 +85,8 @@ fn run_server(receiver: Receiver<DevtoolsControlMsg>, port: u16) {
let actors = Arc::new(Mutex::new(registry)); let actors = Arc::new(Mutex::new(registry));
let mut accepted_connections: Vec<TcpStream> = Vec::new();
/// Process the input from a single devtools client until EOF. /// Process the input from a single devtools client until EOF.
fn handle_client(actors: Arc<Mutex<ActorRegistry>>, mut stream: TcpStream) { fn handle_client(actors: Arc<Mutex<ActorRegistry>>, mut stream: TcpStream) {
println!("connection established to {}", stream.peer_name().unwrap()); println!("connection established to {}", stream.peer_name().unwrap());
@ -154,9 +156,6 @@ fn run_server(receiver: Receiver<DevtoolsControlMsg>, port: u16) {
// from multiple script tasks simultaneously. Polling for new connections // from multiple script tasks simultaneously. Polling for new connections
// for 300ms and then checking the receiver is not a good compromise // 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). // (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 // accept connections and process them, spawning a new tasks for each one
loop { loop {
match acceptor.accept() { match acceptor.accept() {
@ -170,6 +169,7 @@ fn run_server(receiver: Receiver<DevtoolsControlMsg>, port: u16) {
Err(_e) => { /* connection failed */ } Err(_e) => { /* connection failed */ }
Ok(stream) => { Ok(stream) => {
let actors = actors.clone(); let actors = actors.clone();
accepted_connections.push(stream.clone());
spawn_named("DevtoolsClientHandler", proc() { spawn_named("DevtoolsClientHandler", proc() {
// connection succeeded // connection succeeded
handle_client(actors, stream.clone()) handle_client(actors, stream.clone())
@ -177,4 +177,9 @@ fn run_server(receiver: Receiver<DevtoolsControlMsg>, port: u16) {
} }
} }
} }
for connection in accepted_connections.iter_mut() {
let _read = connection.close_read();
let _write = connection.close_write();
}
} }