diff options
Diffstat (limited to 'src/components/main/pipeline.rs')
-rw-r--r-- | src/components/main/pipeline.rs | 118 |
1 files changed, 44 insertions, 74 deletions
diff --git a/src/components/main/pipeline.rs b/src/components/main/pipeline.rs index 9fe5094bcbc..8f5aaef929d 100644 --- a/src/components/main/pipeline.rs +++ b/src/components/main/pipeline.rs @@ -15,12 +15,10 @@ use script::layout_interface::LayoutChan; use script::script_task::LoadMsg; use script::script_task::{AttachLayoutMsg, NewLayoutInfo, ScriptTask, ScriptChan}; use script::script_task; -use servo_msg::constellation_msg::{ConstellationChan, FailureMsg, PipelineId, SubpageId}; +use servo_msg::constellation_msg::{ConstellationChan, PipelineId, SubpageId}; use servo_net::image_cache_task::ImageCacheTask; use servo_net::resource_task::ResourceTask; use servo_util::time::ProfilerChan; -use std::task; -use std::comm; /// A uniquely-identifiable pipeline of script task, layout task, and render task. pub struct Pipeline { @@ -55,10 +53,10 @@ impl Pipeline { opts: Opts, script_pipeline: &Pipeline) -> Pipeline { - let (layout_port, layout_chan) = special_stream!(LayoutChan); - let (render_port, render_chan) = special_stream!(RenderChan); - let (render_shutdown_port, render_shutdown_chan) = comm::stream(); - let (layout_shutdown_port, layout_shutdown_chan) = comm::stream(); + let (layout_port, layout_chan) = LayoutChan::new(); + let (render_port, render_chan) = RenderChan::new(); + let (render_shutdown_port, render_shutdown_chan) = Chan::new(); + let (layout_shutdown_port, layout_shutdown_chan) = Chan::new(); RenderTask::create(id, render_port, @@ -70,6 +68,7 @@ impl Pipeline { LayoutTask::create(id, layout_port, + layout_chan.clone(), constellation_chan, script_pipeline.script_chan.clone(), render_chan.clone(), @@ -105,11 +104,11 @@ impl Pipeline { window_size: Size2D<uint>, opts: Opts) -> 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 (render_shutdown_port, render_shutdown_chan) = comm::stream(); - let (layout_shutdown_port, layout_shutdown_chan) = comm::stream(); + let (script_port, script_chan) = ScriptChan::new(); + let (layout_port, layout_chan) = LayoutChan::new(); + let (render_port, render_chan) = RenderChan::new(); + let (render_shutdown_port, render_shutdown_chan) = Chan::new(); + let (layout_shutdown_port, layout_shutdown_chan) = Chan::new(); let pipeline = Pipeline::new(id, subpage_id, script_chan.clone(), @@ -118,65 +117,36 @@ impl Pipeline { layout_shutdown_port, render_shutdown_port); - // Wrap task creation within a supervised task so that failure will - // only tear down those tasks instead of ours. - let hard_fail = opts.hard_fail; - let failure_chan = constellation_chan.clone(); - let mut supervised_task = task::task(); - let task_port = supervised_task.future_result(); - supervised_task.supervised(); - - spawn_with!(supervised_task, [ - script_port, - resource_task, - render_port, - layout_port, - constellation_chan, - image_cache_task, - profiler_chan, - layout_shutdown_chan, - render_shutdown_chan - ], { - ScriptTask::create(id, - compositor_chan.clone(), - layout_chan.clone(), - script_port, - script_chan.clone(), - constellation_chan.clone(), - resource_task, - image_cache_task.clone(), - window_size); - - RenderTask::create(id, - render_port, - compositor_chan.clone(), - constellation_chan.clone(), - opts.clone(), - profiler_chan.clone(), - render_shutdown_chan); - - LayoutTask::create(id, - layout_port, - constellation_chan, - script_chan.clone(), - render_chan.clone(), - image_cache_task, - opts.clone(), - profiler_chan, - layout_shutdown_chan); - }); + // FIXME(#1434): add back failure supervision - spawn_with!(task::task(), [failure_chan], { - match task_port.recv() { - Ok(*) => (), - Err(*) => { - if hard_fail { - fail!("Pipeline failed in hard-fail mode"); - } - failure_chan.send(FailureMsg(id, subpage_id)); - } - } - }); + ScriptTask::create(id, + compositor_chan.clone(), + layout_chan.clone(), + script_port, + script_chan.clone(), + constellation_chan.clone(), + resource_task, + image_cache_task.clone(), + window_size); + + RenderTask::create(id, + render_port, + compositor_chan.clone(), + constellation_chan.clone(), + opts.clone(), + profiler_chan.clone(), + render_shutdown_chan); + + LayoutTask::create(id, + layout_port, + layout_chan.clone(), + constellation_chan, + script_chan.clone(), + render_chan.clone(), + image_cache_task, + opts.clone(), + profiler_chan, + layout_shutdown_chan); pipeline } @@ -215,9 +185,9 @@ impl Pipeline { } pub fn reload(&mut self) { - do self.url.clone().map() |url| { + self.url.clone().map(|url| { self.load(url); - }; + }); } pub fn exit(&self) { @@ -226,8 +196,8 @@ impl Pipeline { // Wait until all slave tasks have terminated and run destructors // NOTE: We don't wait for script task as we don't always own it - self.render_shutdown_port.try_recv(); - self.layout_shutdown_port.try_recv(); + self.render_shutdown_port.recv_opt(); + self.layout_shutdown_port.recv_opt(); } pub fn to_sendable(&self) -> CompositionPipeline { |