From c377ec7516adbc15d0fb0188f86a371ecf2cd5a0 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 14 Aug 2013 16:32:57 -0700 Subject: [PATCH] Put the compositor on the main thread in the newrt way --- src/components/main/compositing/mod.rs | 33 +----------- src/components/main/servo.rc | 73 ++++++++++++++++---------- 2 files changed, 47 insertions(+), 59 deletions(-) diff --git a/src/components/main/compositing/mod.rs b/src/components/main/compositing/mod.rs index 7cd2ff027ca..c4fc065e142 100644 --- a/src/components/main/compositing/mod.rs +++ b/src/components/main/compositing/mod.rs @@ -191,24 +191,7 @@ impl CompositorTask { } /// Starts the compositor, which listens for messages on the specified port. - pub fn create(opts: Opts, - port: Port, - 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) { + pub fn run(&self) { let app: Application = ApplicationMethods::new(); let window: @mut Window = WindowMethods::new(&app); @@ -508,17 +491,3 @@ impl CompositorTask { 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(); - } -} - diff --git a/src/components/main/servo.rc b/src/components/main/servo.rc index d539b6f1355..a71364f62f9 100755 --- a/src/components/main/servo.rc +++ b/src/components/main/servo.rc @@ -47,6 +47,7 @@ use servo_util::time::{Profiler, ProfilerChan, PrintMsg}; pub use gfx::opts::Opts; pub use gfx::text; pub use servo_util::url::make_url; +use std::cell::Cell; use std::comm; use std::os; use std::rt::rtio::RtioTimer; @@ -95,15 +96,19 @@ pub mod platform; #[path = "util/mod.rs"] pub mod util; -fn main() { - run(&opts::from_cmdline_args(os::args())) +#[start] +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(); - - // Create the profiler channel. let (profiler_port, profiler_chan) = comm::stream(); + let (compositor_port, compositor_chan) = comm::stream(); + let profiler_chan = ProfilerChan::new(profiler_chan); Profiler::create(profiler_port); 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); - 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(); - 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()); + do spawn { + let profiler_chan = profiler_chan_clone.clone(); + let compositor_chan = compositor_chan.clone(); - // Send the URL command to the constellation. - for filename in opts.urls.iter() { - constellation_chan.send(InitLoadUrlMsg(make_url(filename.clone(), None))) + let opts = &opts_clone.clone(); + + // 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. - debug!("master: Shut down"); - let (exit_response_from_constellation, exit_chan) = comm::stream(); - constellation_chan.send(ExitMsg(exit_chan)); - exit_response_from_constellation.recv(); + let compositor_task = CompositorTask::new(opts, + compositor_port, + profiler_chan, + shutdown_chan); + debug!("preparing to enter main loop"); + compositor_task.run(); }