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 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;
@ -466,6 +467,9 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
}
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);
}

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

@ -85,6 +85,8 @@ fn run_server(receiver: Receiver<DevtoolsControlMsg>, port: u16) {
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.
fn handle_client(actors: Arc<Mutex<ActorRegistry>>, mut stream: TcpStream) {
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
// 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() {
@ -170,6 +169,7 @@ fn run_server(receiver: Receiver<DevtoolsControlMsg>, 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())
@ -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();
}
}