mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
Put the compositor on the main thread in the newrt way
This commit is contained in:
parent
fb3db6a72d
commit
c377ec7516
2 changed files with 47 additions and 59 deletions
|
@ -191,24 +191,7 @@ impl CompositorTask {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Starts the compositor, which listens for messages on the specified port.
|
/// Starts the compositor, which listens for messages on the specified port.
|
||||||
pub fn create(opts: Opts,
|
pub fn run(&self) {
|
||||||
port: Port<Msg>,
|
|
||||||
profiler_chan: ProfilerChan,
|
|
||||||
shutdown_chan: Chan<()>) {
|
|
||||||
let port = Cell::new(port);
|
|
||||||
let shutdown_chan = Cell::new(shutdown_chan);
|
|
||||||
let opts = Cell::new(opts);
|
|
||||||
do on_osmain {
|
|
||||||
let compositor_task = CompositorTask::new(opts.take(),
|
|
||||||
port.take(),
|
|
||||||
profiler_chan.clone(),
|
|
||||||
shutdown_chan.take());
|
|
||||||
debug!("preparing to enter main loop");
|
|
||||||
compositor_task.run_main_loop();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
fn run_main_loop(&self) {
|
|
||||||
let app: Application = ApplicationMethods::new();
|
let app: Application = ApplicationMethods::new();
|
||||||
let window: @mut Window = WindowMethods::new(&app);
|
let window: @mut Window = WindowMethods::new(&app);
|
||||||
|
|
||||||
|
@ -508,17 +491,3 @@ impl CompositorTask {
|
||||||
self.shutdown_chan.send(())
|
self.shutdown_chan.send(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A function for spawning into the platform's main thread.
|
|
||||||
fn on_osmain(f: ~fn()) {
|
|
||||||
// FIXME: rust#6399
|
|
||||||
let mut main_task = task::task();
|
|
||||||
/*
|
|
||||||
main_task.sched_mode(task::PlatformThread);
|
|
||||||
*/
|
|
||||||
fail!("stubbed out!");
|
|
||||||
do main_task.spawn {
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,7 @@ use servo_util::time::{Profiler, ProfilerChan, PrintMsg};
|
||||||
pub use gfx::opts::Opts;
|
pub use gfx::opts::Opts;
|
||||||
pub use gfx::text;
|
pub use gfx::text;
|
||||||
pub use servo_util::url::make_url;
|
pub use servo_util::url::make_url;
|
||||||
|
use std::cell::Cell;
|
||||||
use std::comm;
|
use std::comm;
|
||||||
use std::os;
|
use std::os;
|
||||||
use std::rt::rtio::RtioTimer;
|
use std::rt::rtio::RtioTimer;
|
||||||
|
@ -95,15 +96,19 @@ pub mod platform;
|
||||||
#[path = "util/mod.rs"]
|
#[path = "util/mod.rs"]
|
||||||
pub mod util;
|
pub mod util;
|
||||||
|
|
||||||
fn main() {
|
#[start]
|
||||||
run(&opts::from_cmdline_args(os::args()))
|
fn start(argc: int, argv: **u8, crate_map: *u8) -> int {
|
||||||
|
do std::rt::start_on_main_thread(argc, argv, crate_map) {
|
||||||
|
let opts = opts::from_cmdline_args(os::args());
|
||||||
|
run(opts)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run(opts: &Opts) {
|
fn run(opts: Opts) {
|
||||||
let (shutdown_port, shutdown_chan) = comm::stream();
|
let (shutdown_port, shutdown_chan) = comm::stream();
|
||||||
|
|
||||||
// Create the profiler channel.
|
|
||||||
let (profiler_port, profiler_chan) = comm::stream();
|
let (profiler_port, profiler_chan) = comm::stream();
|
||||||
|
let (compositor_port, compositor_chan) = comm::stream();
|
||||||
|
|
||||||
let profiler_chan = ProfilerChan::new(profiler_chan);
|
let profiler_chan = ProfilerChan::new(profiler_chan);
|
||||||
Profiler::create(profiler_port);
|
Profiler::create(profiler_port);
|
||||||
do opts.profiler_period.map |&period| {
|
do opts.profiler_period.map |&period| {
|
||||||
|
@ -117,34 +122,48 @@ fn run(opts: &Opts) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Create the compositor.
|
|
||||||
let (compositor_port, compositor_chan) = comm::stream();
|
|
||||||
let compositor_chan = CompositorChan::new(compositor_chan);
|
let compositor_chan = CompositorChan::new(compositor_chan);
|
||||||
CompositorTask::create(opts.clone(), compositor_port, profiler_chan.clone(), shutdown_chan);
|
let profiler_chan_clone = profiler_chan.clone();
|
||||||
|
|
||||||
// Create a Servo instance.
|
let opts_clone = opts.clone();
|
||||||
|
|
||||||
let resource_task = ResourceTask();
|
do spawn {
|
||||||
let image_cache_task = ImageCacheTask(resource_task.clone());
|
let profiler_chan = profiler_chan_clone.clone();
|
||||||
let constellation_chan = Constellation::start(compositor_chan.clone(),
|
let compositor_chan = compositor_chan.clone();
|
||||||
opts,
|
|
||||||
resource_task,
|
|
||||||
image_cache_task,
|
|
||||||
profiler_chan.clone());
|
|
||||||
|
|
||||||
// Send the URL command to the constellation.
|
let opts = &opts_clone.clone();
|
||||||
for filename in opts.urls.iter() {
|
|
||||||
constellation_chan.send(InitLoadUrlMsg(make_url(filename.clone(), None)))
|
// Create a Servo instance.
|
||||||
|
|
||||||
|
let resource_task = ResourceTask();
|
||||||
|
let image_cache_task = ImageCacheTask(resource_task.clone());
|
||||||
|
let constellation_chan = Constellation::start(compositor_chan.clone(),
|
||||||
|
opts,
|
||||||
|
resource_task,
|
||||||
|
image_cache_task,
|
||||||
|
profiler_chan.clone());
|
||||||
|
|
||||||
|
// Send the URL command to the constellation.
|
||||||
|
for filename in opts.urls.iter() {
|
||||||
|
constellation_chan.send(InitLoadUrlMsg(make_url(filename.clone(), None)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for the compositor to shut down.
|
||||||
|
shutdown_port.recv();
|
||||||
|
|
||||||
|
// Shut the constellation down.
|
||||||
|
debug!("master: Shut down");
|
||||||
|
let (exit_response_from_constellation, exit_chan) = comm::stream();
|
||||||
|
constellation_chan.send(ExitMsg(exit_chan));
|
||||||
|
exit_response_from_constellation.recv();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait for the compositor to shut down.
|
|
||||||
shutdown_port.recv();
|
|
||||||
|
|
||||||
// Shut the constellation down.
|
let compositor_task = CompositorTask::new(opts,
|
||||||
debug!("master: Shut down");
|
compositor_port,
|
||||||
let (exit_response_from_constellation, exit_chan) = comm::stream();
|
profiler_chan,
|
||||||
constellation_chan.send(ExitMsg(exit_chan));
|
shutdown_chan);
|
||||||
exit_response_from_constellation.recv();
|
debug!("preparing to enter main loop");
|
||||||
|
compositor_task.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue