diff --git a/src/servo/content/content_task.rs b/src/servo/content/content_task.rs index e6cf462cb8f..945d43fd8b9 100644 --- a/src/servo/content/content_task.rs +++ b/src/servo/content/content_task.rs @@ -51,7 +51,7 @@ enum PingMsg { type ContentTask = Chan; -fn ContentTask(layout_task: LayoutTask, compositor: S, resource_task: ResourceTask) -> ContentTask { +fn ContentTask(layout_task: LayoutTask, +compositor: S, resource_task: ResourceTask) -> ContentTask { do spawn_listener:: |from_master| { Content(layout_task, compositor, from_master, resource_task).start(); } @@ -70,7 +70,7 @@ fn join_layout(scope: NodeScope, layout_task: LayoutTask) { } } -struct Content { +struct Content { let compositor: C; let layout_task: LayoutTask; let from_master: comm::Port; @@ -84,7 +84,7 @@ struct Content { let resource_task: ResourceTask; - new(layout_task: LayoutTask, compositor: C, from_master: Port, + new(layout_task: LayoutTask, +compositor: C, from_master: Port, resource_task: ResourceTask) { self.layout_task = layout_task; self.compositor = compositor; diff --git a/src/servo/engine.rs b/src/servo/engine.rs index f84778dec56..4bfd5189ae4 100644 --- a/src/servo/engine.rs +++ b/src/servo/engine.rs @@ -1,3 +1,5 @@ +export EngineTask, EngineProto; + import gfx::compositor::Compositor; import gfx::render_task; import render_task::RenderTask; @@ -18,17 +20,10 @@ fn macros() { include!("macros.rs"); } -struct Engine { - let compositor: C; +type EngineTask = EngineProto::client::Running; - let render_task: RenderTask; - let resource_task: ResourceTask; - let image_cache_task: ImageCacheTask; - let layout_task: LayoutTask; - let content_task: ContentTask; - - new(+compositor: C) { - self.compositor = compositor; +fn EngineTask(+compositor: C) -> EngineTask { + do spawn_service(EngineProto::init) |request, move compositor| { let render_task = RenderTask(compositor); let resource_task = ResourceTask(); @@ -36,46 +31,59 @@ struct Engine { let layout_task = LayoutTask(render_task, image_cache_task); let content_task = ContentTask(layout_task, compositor, resource_task); - self.render_task = render_task; - self.resource_task = resource_task; - self.image_cache_task = image_cache_task; - self.layout_task = layout_task; - self.content_task = content_task; + Engine { + compositor: compositor, + render_task: render_task, + resource_task: resource_task, + image_cache_task: image_cache_task, + layout_task: layout_task, + content_task: content_task, + }.run(request); } +} - fn start() -> EngineProto::client::Running { - do spawn_service(EngineProto::init) |request| { - import EngineProto::*; - let mut request = request; - loop { - select! { - request => { - LoadURL(url) -> next { - // TODO: change copy to move once we have match move - let url = move_ref!(url); - if url.path.ends_with(".js") { - self.content_task.send(content_task::ExecuteMsg(url)) - } else { - self.content_task.send(content_task::ParseMsg(url)) - } - request = next; - }, - - Exit -> channel { - self.content_task.send(content_task::ExitMsg); - self.layout_task.send(layout_task::ExitMsg); - - let (response_chan, response_port) = pipes::stream(); - self.render_task.send(render_task::ExitMsg(response_chan)); - response_port.recv(); - - self.image_cache_task.exit(); - self.resource_task.send(resource_task::Exit); - - server::Exited(channel); - break +struct Engine { + compositor: C; + render_task: RenderTask; + resource_task: ResourceTask; + image_cache_task: ImageCacheTask; + layout_task: LayoutTask; + content_task: ContentTask; +} + +impl Engine { + fn run(+request: EngineProto::server::Running) { + import EngineProto::*; + let mut request = request; + + loop { + select! { + request => { + LoadURL(url) -> next { + // TODO: change copy to move once we have match move + let url = move_ref!(url); + if url.path.ends_with(".js") { + self.content_task.send(content_task::ExecuteMsg(url)) + } else { + self.content_task.send(content_task::ParseMsg(url)) } + request = next; + }, + + Exit -> channel { + self.content_task.send(content_task::ExitMsg); + self.layout_task.send(layout_task::ExitMsg); + + let (response_chan, response_port) = pipes::stream(); + self.render_task.send(render_task::ExitMsg(response_chan)); + response_port.recv(); + + self.image_cache_task.exit(); + self.resource_task.send(resource_task::Exit); + + server::Exited(channel); + break } } } diff --git a/src/servo/gfx/render_task.rs b/src/servo/gfx/render_task.rs index 1b2247651f4..83a13a19398 100644 --- a/src/servo/gfx/render_task.rs +++ b/src/servo/gfx/render_task.rs @@ -30,7 +30,7 @@ enum Msg { type RenderTask = comm::Chan; -fn RenderTask(compositor: C) -> RenderTask { +fn RenderTask(+compositor: C) -> RenderTask { do task::spawn_listener |po: comm::Port| { let (draw_target_ch, draw_target_po) = pipes::stream(); let mut draw_target_ch = draw_target_ch; diff --git a/src/servo/servo.rs b/src/servo/servo.rs index a8200785648..2700eb37f43 100644 --- a/src/servo/servo.rs +++ b/src/servo/servo.rs @@ -3,8 +3,7 @@ import option::swap_unwrap; import platform::osmain; import osmain::{OSMain, AddKeyHandler}; import opts::{Opts, Screen, Png}; -import engine::Engine; -import engine::EngineProto; +import engine::{EngineTask, EngineProto}; import url_to_str = std::net::url::to_str; import util::url::make_url; @@ -39,14 +38,13 @@ fn run_pipeline_screen(urls: ~[~str]) { osmain.send(AddKeyHandler(keypress_to_engine)); // Create a serve instance - let engine = Engine(osmain); - let mut engine_chan = some(engine.start()); + let mut engine_task = some(EngineTask(osmain)); for urls.each |filename| { let url = make_url(filename, none); #debug["master: Sending url `%s`", url_to_str(url)]; - engine_chan = - some(EngineProto::client::LoadURL(swap_unwrap(&mut engine_chan), + engine_task = + some(EngineProto::client::LoadURL(swap_unwrap(&mut engine_task), url)); #debug["master: Waiting for keypress"]; @@ -58,8 +56,8 @@ fn run_pipeline_screen(urls: ~[~str]) { // Shut everything down #debug["master: Shut down"]; - let engine_chan = EngineProto::client::Exit(option::unwrap(engine_chan)); - pipes::recv(engine_chan); + let engine_task = EngineProto::client::Exit(option::unwrap(engine_task)); + pipes::recv(engine_task); osmain.send(osmain::Exit); } @@ -74,18 +72,16 @@ fn run_pipeline_png(-url: ~str, outfile: ~str) { listen(|pngdata_from_compositor| { let compositor = PngCompositor(pngdata_from_compositor); - let engine = Engine(compositor); - let engine_chan = engine.start(); - let engine_chan = - EngineProto::client::LoadURL(engine_chan, make_url(url, none)); + let engine_task = EngineTask(compositor); + let engine_task = EngineProto::client::LoadURL(engine_task, make_url(url, none)); match buffered_file_writer(outfile) { ok(writer) => writer.write(pngdata_from_compositor.recv()), err(e) => fail e } - let engine_chan = EngineProto::client::Exit(engine_chan); - pipes::recv(engine_chan); + let engine_task = EngineProto::client::Exit(engine_task); + pipes::recv(engine_task); compositor.send(png_compositor::Exit); }) }