Use pipes for exit messages.

This commit is contained in:
Eric Holk 2012-07-12 23:49:48 -07:00
parent 38968323bd
commit 41a68d1813
5 changed files with 31 additions and 27 deletions

View file

@ -73,8 +73,8 @@ class Document {
class Content<S:Sink send copy> { class Content<S:Sink send copy> {
let sink: S; let sink: S;
let layout: Layout; let layout: Layout;
let from_master: port<ControlMsg>; let from_master: comm::port<ControlMsg>;
let event_port: port<Event>; let event_port: comm::port<Event>;
let scope: NodeScope; let scope: NodeScope;
let jsrt: jsrt; let jsrt: jsrt;

View file

@ -5,12 +5,14 @@ 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 pipes::{port, chan};
class Engine<S:Sink send copy> { class Engine<S:Sink send copy> {
let sink: S; let sink: S;
let renderer: Renderer; let renderer: Renderer;
let layout: Layout; let layout: Layout;
let content: chan<content::ControlMsg>; let content: comm::chan<content::ControlMsg>;
new(+sink: S) { new(+sink: S) {
self.sink = sink; self.sink = sink;
@ -24,7 +26,7 @@ class Engine<S:Sink send copy> {
self.content = content; self.content = content;
} }
fn start() -> chan<Msg> { fn start() -> comm::chan<Msg> {
do spawn_listener::<Msg> |request| { do spawn_listener::<Msg> |request| {
while self.handle_request(request.recv()) { while self.handle_request(request.recv()) {
// Go on... // Go on...
@ -47,10 +49,12 @@ class Engine<S:Sink send copy> {
ExitMsg(sender) { ExitMsg(sender) {
self.content.send(content::ExitMsg); self.content.send(content::ExitMsg);
self.layout.send(layout_task::ExitMsg); self.layout.send(layout_task::ExitMsg);
do listen |response_channel| {
self.renderer.send(renderer::ExitMsg(response_channel)); let (response_chan, response_port) = pipes::stream();
response_channel.recv();
} self.renderer.send(renderer::ExitMsg(response_chan));
response_port.recv();
sender.send(()); sender.send(());
ret false; ret false;
} }

View file

@ -131,10 +131,9 @@ fn sanity_check() {
let dlist : display_list = dvec(); let dlist : display_list = dvec();
renderer.send(RenderMsg(dlist)); renderer.send(RenderMsg(dlist));
listen(|from_renderer| { let (exit_chan, exit_response_from_engine) = pipes::stream();
renderer.send(renderer::ExitMsg(from_renderer)); renderer.send(renderer::ExitMsg(exit_chan));
from_renderer.recv(); exit_response_from_engine.recv();
});
sink.send(Exit) sink.send(Exit)
}) })

View file

@ -15,11 +15,13 @@ import azure_hl::AsAzureRect;
import ptr::addr_of; import ptr::addr_of;
import arc::arc; import arc::arc;
type Renderer = chan<Msg>; import pipes::{port, chan};
type Renderer = comm::chan<Msg>;
enum Msg { enum Msg {
RenderMsg(dl::display_list), RenderMsg(dl::display_list),
ExitMsg(comm::chan<()>) ExitMsg(pipes::chan<()>)
} }
#[doc = " #[doc = "
@ -29,12 +31,12 @@ each rendered frame and submit them to be drawn to the display
FIXME: Change this name to Compositor. FIXME: Change this name to Compositor.
"] "]
iface Sink { iface Sink {
fn begin_drawing(next_dt: chan<AzDrawTargetRef>); fn begin_drawing(next_dt: comm::chan<AzDrawTargetRef>);
fn draw(next_dt: chan<AzDrawTargetRef>, draw_me: AzDrawTargetRef); fn draw(next_dt: comm::chan<AzDrawTargetRef>, draw_me: AzDrawTargetRef);
fn add_event_listener(listener: chan<Event>); fn add_event_listener(listener: comm::chan<Event>);
} }
fn Renderer<S: Sink send copy>(sink: S) -> chan<Msg> { fn Renderer<S: Sink send copy>(sink: S) -> comm::chan<Msg> {
task::spawn_listener::<Msg>(|po| { task::spawn_listener::<Msg>(|po| {
listen(|draw_target_ch| { listen(|draw_target_ch| {
#debug("renderer: beginning rendering loop"); #debug("renderer: beginning rendering loop");

View file

@ -5,7 +5,7 @@ import osmain::{OSMain, AddKeyHandler};
import opts::{Opts, Screen, Png}; import opts::{Opts, Screen, Png};
import engine::{Engine, LoadURLMsg}; import engine::{Engine, LoadURLMsg};
import pipes::port; import pipes::{port, chan};
fn main(args: ~[~str]) { fn main(args: ~[~str]) {
run(opts::from_cmdline_args(args)) run(opts::from_cmdline_args(args))
@ -52,10 +52,10 @@ fn run_pipeline_screen(urls: ~[~str]) {
// Shut everything down // Shut everything down
#debug["master: Shut down"]; #debug["master: Shut down"];
listen(|exit_response_from_engine| { let (exit_chan, exit_response_from_engine) = pipes::stream();
engine_chan.send(engine::ExitMsg(exit_response_from_engine)); engine_chan.send(engine::ExitMsg(exit_chan));
exit_response_from_engine.recv(); exit_response_from_engine.recv();
});
osmain.send(osmain::Exit); osmain.send(osmain::Exit);
} }
@ -79,10 +79,9 @@ fn run_pipeline_png(-url: ~str, outfile: ~str) {
} }
err(e) { fail e } err(e) { fail e }
} }
listen(|exit_response_from_engine| { let (exit_chan, exit_response_from_engine) = pipes::stream();
engine_chan.send(engine::ExitMsg(exit_response_from_engine)); engine_chan.send(engine::ExitMsg(exit_chan));
exit_response_from_engine.recv(); exit_response_from_engine.recv();
});
sink.send(pngsink::Exit); sink.send(pngsink::Exit);
}) })
} }