diff --git a/ports/geckolib/data.rs b/ports/geckolib/data.rs index 1962243a310..02fdece2411 100644 --- a/ports/geckolib/data.rs +++ b/ports/geckolib/data.rs @@ -9,6 +9,7 @@ use num_cpus; use selector_impl::{Animation, SharedStyleContext, Stylist, Stylesheet}; use std::cmp; use std::collections::HashMap; +use std::env; use std::sync::mpsc::{channel, Receiver, Sender}; use std::sync::{Arc, RwLock}; use style::dom::OpaqueNode; @@ -36,6 +37,17 @@ pub struct PerDocumentStyleData { // FIXME(bholley): This shouldn't be per-document. pub work_queue: WorkQueue, + + pub num_threads: usize, +} + +lazy_static! { + pub static ref NUM_THREADS: usize = { + match env::var("STYLO_THREADS").map(|s| s.parse::().expect("invalid STYLO_THREADS")) { + Ok(num) => num, + _ => cmp::max(num_cpus::get() * 3 / 4, 1), + } + }; } impl PerDocumentStyleData { @@ -45,7 +57,6 @@ impl PerDocumentStyleData { let device = Device::new(MediaType::Screen, window_size); let (new_anims_sender, new_anims_receiver) = channel(); - let num_threads = cmp::max(num_cpus::get() * 3 / 4, 1); PerDocumentStyleData { stylist: Arc::new(Stylist::new(device)), @@ -55,7 +66,8 @@ impl PerDocumentStyleData { new_animations_receiver: new_anims_receiver, running_animations: Arc::new(RwLock::new(HashMap::new())), expired_animations: Arc::new(RwLock::new(HashMap::new())), - work_queue: WorkQueue::new("StyleWorker", thread_state::LAYOUT, num_threads), + work_queue: WorkQueue::new("StyleWorker", thread_state::LAYOUT, *NUM_THREADS), + num_threads: *NUM_THREADS, } } diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index 8f76407749c..baf3b3b22ac 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -29,6 +29,7 @@ use style::parallel; use style::parser::ParserContextExtraData; use style::properties::{ComputedValues, PropertyDeclarationBlock}; use style::selector_impl::{SelectorImplExt, PseudoElementCascadeType}; +use style::sequential; use style::stylesheets::Origin; use traversal::RecalcStyleOnly; use url::Url; @@ -109,7 +110,12 @@ fn restyle_subtree(node: GeckoNode, raw_data: *mut RawServoStyleSet) { }; if node.is_dirty() || node.has_dirty_descendants() { - parallel::traverse_dom::(node, &shared_style_context, &mut per_doc_data.work_queue); + if per_doc_data.num_threads == 1 { + sequential::traverse_dom::(node, &shared_style_context); + } else { + parallel::traverse_dom::(node, &shared_style_context, + &mut per_doc_data.work_queue); + } } }