aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/main/pipeline.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/main/pipeline.rs')
-rw-r--r--src/components/main/pipeline.rs118
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 {