diff options
author | Lars Bergstrom <lbergstrom@mozilla.com> | 2013-09-11 17:51:49 -0700 |
---|---|---|
committer | Lars Bergstrom <lbergstrom@mozilla.com> | 2013-09-12 13:55:18 -0700 |
commit | 26ec02226ec8f356725352cedd1a5aa8c19fe9e6 (patch) | |
tree | 8a4389294d93157ee3fe49cc8fce925928710496 /src/components/main/pipeline.rs | |
parent | 4cf80cd49c69a0da4b9d8c7df0ca5a9ece3b5a64 (diff) | |
download | servo-26ec02226ec8f356725352cedd1a5aa8c19fe9e6.tar.gz servo-26ec02226ec8f356725352cedd1a5aa8c19fe9e6.zip |
Pipeline create is now wrapped in a task that supervises the tasks
created by script, rendering, and layout. When any of those fail,
the pipeline is removed from the FrameTree and a new one is created
with a failure HTML file.
Additionally, the top-level Makefile is changed to store debug info.
Diffstat (limited to 'src/components/main/pipeline.rs')
-rw-r--r-- | src/components/main/pipeline.rs | 106 |
1 files changed, 76 insertions, 30 deletions
diff --git a/src/components/main/pipeline.rs b/src/components/main/pipeline.rs index 0204748c20b..0a716e0acf9 100644 --- a/src/components/main/pipeline.rs +++ b/src/components/main/pipeline.rs @@ -11,7 +11,7 @@ use gfx::opts::Opts; use layout::layout_task::LayoutTask; use script::layout_interface::LayoutChan; use script::script_task::{ExecuteMsg, LoadMsg}; -use servo_msg::constellation_msg::{ConstellationChan, PipelineId, SubpageId}; +use servo_msg::constellation_msg::{ConstellationChan, FailureMsg, PipelineId, SubpageId}; use script::dom::node::AbstractNode; use script::script_task::{AttachLayoutMsg, NewLayoutInfo, ScriptTask, ScriptChan}; use script::script_task; @@ -20,9 +20,11 @@ use servo_net::resource_task::ResourceTask; use servo_util::time::ProfilerChan; use geom::size::Size2D; use extra::future::Future; +use std::cell::Cell; use std::comm; +use std::task; -/// A uniquely-identifiable pipeline of stript task, layout task, and render task. +/// A uniquely-identifiable pipeline of script task, layout task, and render task. #[deriving(Clone)] pub struct Pipeline { id: PipelineId, @@ -94,37 +96,81 @@ impl Pipeline { let (script_port, script_chan) = special_stream!(ScriptChan); let (layout_port, layout_chan) = special_stream!(LayoutChan); let (render_port, render_chan) = special_stream!(RenderChan); + let pipeline = Pipeline::new(id, + subpage_id, + script_chan.clone(), + layout_chan.clone(), + render_chan.clone()); + let (port, chan) = stream::<task::TaskResult>(); + + let script_port = Cell::new(script_port); + let resource_task = Cell::new(resource_task); + let size = Cell::new(size); + let render_port = Cell::new(render_port); + let layout_port = Cell::new(layout_port); + let constellation_chan_handler = Cell::new(constellation_chan.clone()); + let constellation_chan = Cell::new(constellation_chan); + let image_cache_task = Cell::new(image_cache_task); + let profiler_chan = Cell::new(profiler_chan); + + do Pipeline::spawn(chan) { + let script_port = script_port.take(); + let resource_task = resource_task.take(); + let size = size.take(); + let render_port = render_port.take(); + let layout_port = layout_port.take(); + let constellation_chan = constellation_chan.take(); + let image_cache_task = image_cache_task.take(); + let profiler_chan = profiler_chan.take(); + + ScriptTask::create(id, + compositor_chan.clone(), + layout_chan.clone(), + script_port, + script_chan.clone(), + constellation_chan.clone(), + resource_task, + image_cache_task.clone(), + size); + + RenderTask::create(id, + render_port, + compositor_chan.clone(), + opts.clone(), + profiler_chan.clone()); + + LayoutTask::create(id, + layout_port, + constellation_chan, + script_chan.clone(), + render_chan.clone(), + image_cache_task, + opts.clone(), + profiler_chan); + }; - ScriptTask::create(id, - compositor_chan.clone(), - layout_chan.clone(), - script_port, - script_chan.clone(), - constellation_chan.clone(), - resource_task, - image_cache_task.clone(), - size); - + do spawn { + match port.recv() { + task::Success => (), + task::Failure => { + let constellation_chan = constellation_chan_handler.take(); + constellation_chan.send(FailureMsg(id, subpage_id)); + } + } + }; - RenderTask::create(id, - render_port, - compositor_chan.clone(), - opts.clone(), - profiler_chan.clone()); + pipeline + } - LayoutTask::create(id, - layout_port, - constellation_chan, - script_chan.clone(), - render_chan.clone(), - image_cache_task, - opts.clone(), - profiler_chan); - Pipeline::new(id, - subpage_id, - script_chan, - layout_chan, - render_chan) + /// This function wraps the task creation within a supervised task + /// so that failure will only tear down those tasks instead of ours. + pub fn spawn(chan:Chan<task::TaskResult>, f:~fn()) { + let mut task = task::task(); + task.opts.notify_chan = Some(chan); + task.supervised(); + do task.spawn { + f(); + }; } pub fn new(id: PipelineId, |