Begin threading the ResourceTask through the engine

This commit is contained in:
Brian Anderson 2012-07-27 16:19:38 -07:00
parent c01899233a
commit f48309739f
3 changed files with 22 additions and 6 deletions

View file

@ -35,6 +35,9 @@ import result::extensions;
import dom::bindings::utils::rust_box; import dom::bindings::utils::rust_box;
import js::rust::compartment; import js::rust::compartment;
import resource::resource_task;
import resource_task::{ResourceTask};
type Content = chan<ControlMsg>; type Content = chan<ControlMsg>;
enum ControlMsg { enum ControlMsg {
@ -81,7 +84,9 @@ class Content<S:Sink send copy> {
let mut document: option<@Document>; let mut document: option<@Document>;
new(layout: Layout, sink: S, from_master: port<ControlMsg>) { let resource_task: ResourceTask;
new(layout: Layout, sink: S, from_master: port<ControlMsg>, resource_task: ResourceTask) {
self.layout = layout; self.layout = layout;
self.sink = sink; self.sink = sink;
self.from_master = from_master; self.from_master = from_master;
@ -93,6 +98,8 @@ class Content<S:Sink send copy> {
self.document = none; self.document = none;
self.sink.add_event_listener(self.event_port.chan()); self.sink.add_event_listener(self.event_port.chan());
self.resource_task = resource_task;
} }
fn start() { fn start() {
@ -119,7 +126,7 @@ class Content<S:Sink send copy> {
// Note: we can parse the next document in parallel // Note: we can parse the next document in parallel
// with any previous documents. // with any previous documents.
let stream = spawn_html_lexer_task(copy filename); let stream = spawn_html_lexer_task(copy filename, self.resource_task);
let (root, style_port, js_port) = build_dom(self.scope, stream); let (root, style_port, js_port) = build_dom(self.scope, stream);
let css_rules = style_port.recv(); let css_rules = style_port.recv();
let js_scripts = js_port.recv(); let js_scripts = js_port.recv();
@ -210,9 +217,9 @@ class Content<S:Sink send copy> {
} }
} }
fn create_content<S: Sink send copy>(layout: Layout, sink: S) -> chan<ControlMsg> { fn create_content<S: Sink send copy>(layout: Layout, sink: S, resource_task: ResourceTask) -> chan<ControlMsg> {
do spawn_listener::<ControlMsg> |from_master| { do spawn_listener::<ControlMsg> |from_master| {
Content(layout, sink, from_master).start(); Content(layout, sink, from_master, resource_task).start();
} }
} }

View file

@ -4,6 +4,8 @@ import comm::chan;
import layout::layout_task; import layout::layout_task;
import layout_task::Layout; import layout_task::Layout;
import content::{Content, ExecuteMsg, ParseMsg, ExitMsg, create_content}; import content::{Content, ExecuteMsg, ParseMsg, ExitMsg, create_content};
import resource::resource_task;
import resource::resource_task::{ResourceTask};
import pipes::{port, chan}; import pipes::{port, chan};
@ -12,6 +14,7 @@ class Engine<S:Sink send copy> {
let renderer: Renderer; let renderer: Renderer;
let layout: Layout; let layout: Layout;
let resource_task: ResourceTask;
let content: comm::chan<content::ControlMsg>; let content: comm::chan<content::ControlMsg>;
new(+sink: S) { new(+sink: S) {
@ -19,10 +22,12 @@ class Engine<S:Sink send copy> {
let renderer = Renderer(sink); let renderer = Renderer(sink);
let layout = Layout(renderer); let layout = Layout(renderer);
let content = create_content(layout, sink); let resource_task = ResourceTask();
let content = create_content(layout, sink, resource_task);
self.renderer = renderer; self.renderer = renderer;
self.layout = layout; self.layout = layout;
self.resource_task = resource_task;
self.content = content; self.content = content;
} }
@ -55,6 +60,8 @@ class Engine<S:Sink send copy> {
self.renderer.send(renderer::ExitMsg(response_chan)); self.renderer.send(renderer::ExitMsg(response_chan));
response_port.recv(); response_port.recv();
self.resource_task.send(resource_task::Exit);
sender.send(()); sender.send(());
ret false; ret false;
} }

View file

@ -4,6 +4,8 @@ import option::is_none;
import str::from_bytes; import str::from_bytes;
import vec::push; import vec::push;
import lexer_util::*; import lexer_util::*;
import resource::resource_task;
import resource_task::{ResourceTask};
enum Token { enum Token {
StartOpeningTag(~str), StartOpeningTag(~str),
@ -168,7 +170,7 @@ fn lexer(reader: io::reader, state : ParseState) -> HtmlLexer {
} }
#[warn(no_non_implicitly_copyable_typarams)] #[warn(no_non_implicitly_copyable_typarams)]
fn spawn_html_lexer_task(-filename: ~str) -> port<Token> { fn spawn_html_lexer_task(-filename: ~str, resource_task: ResourceTask) -> port<Token> {
let html_port = port(); let html_port = port();
let html_chan = chan(html_port); let html_chan = chan(html_port);
let html_file = copy filename; let html_file = copy filename;