aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Sapin <simon.sapin@exyr.org>2017-03-19 14:46:00 +0100
committerSimon Sapin <simon.sapin@exyr.org>2017-03-19 23:12:15 +0100
commit643545b87f1129dee6b96db33d28bf16d644f5ee (patch)
tree91f5237c6425a0d4940fa684bbf36dee77d07d47
parent02dc8b286ae1914c2c5839c65d0f0fca7ab92f0c (diff)
downloadservo-643545b87f1129dee6b96db33d28bf16d644f5ee.tar.gz
servo-643545b87f1129dee6b96db33d28bf16d644f5ee.zip
Per-document shared lock for author-origin stylesheets.
Fix #16027
-rw-r--r--components/layout_thread/lib.rs40
-rw-r--r--components/script/dom/document.rs3
-rw-r--r--components/style/servo/mod.rs10
3 files changed, 25 insertions, 28 deletions
diff --git a/components/layout_thread/lib.rs b/components/layout_thread/lib.rs
index e456672e4fa..31500461fa4 100644
--- a/components/layout_thread/lib.rs
+++ b/components/layout_thread/lib.rs
@@ -114,7 +114,6 @@ use style::error_reporting::StdoutErrorReporter;
use style::logical_geometry::LogicalPoint;
use style::media_queries::{Device, MediaType};
use style::parser::ParserContextExtraData;
-use style::servo::AUTHOR_SHARED_LOCK;
use style::servo::restyle_damage::{REFLOW, REFLOW_OUT_OF_FLOW, REPAINT, REPOSITION, STORE_OVERFLOW};
use style::shared_lock::{SharedRwLock, SharedRwLockReadGuard, StylesheetGuards};
use style::stylesheets::{Origin, Stylesheet, UserAgentStylesheets};
@@ -190,6 +189,9 @@ pub struct LayoutThread {
/// The root of the flow tree.
root_flow: Option<FlowRef>,
+ /// The document-specific shared lock used for author-origin stylesheets
+ document_shared_lock: Option<SharedRwLock>,
+
/// The list of currently-running animations.
running_animations: Arc<RwLock<HashMap<OpaqueNode, Vec<Animation>>>>,
@@ -442,6 +444,7 @@ impl LayoutThread {
new_animations_receiver: new_animations_receiver,
outstanding_web_fonts: outstanding_web_fonts_counter,
root_flow: None,
+ document_shared_lock: None,
running_animations: Arc::new(RwLock::new(HashMap::new())),
expired_animations: Arc::new(RwLock::new(HashMap::new())),
epoch: Epoch(0),
@@ -1020,7 +1023,9 @@ impl LayoutThread {
// Calculate the actual viewport as per DEVICE-ADAPT § 6
- let author_guard = document.style_shared_lock().read();
+ let document_shared_lock = document.style_shared_lock();
+ self.document_shared_lock = Some(document_shared_lock.clone());
+ let author_guard = document_shared_lock.read();
let device = Device::new(MediaType::Screen, initial_viewport);
Arc::get_mut(&mut rw_data.stylist).unwrap()
.set_device(device, &author_guard, &data.document_stylesheets);
@@ -1349,20 +1354,23 @@ impl LayoutThread {
println!("**** pipeline={}\tForDisplay\tSpecial\tAnimationTick", self.id);
}
- let reflow_info = Reflow {
- goal: ReflowGoal::ForDisplay,
- page_clip_rect: max_rect(),
- };
-
- let author_guard = AUTHOR_SHARED_LOCK.read();
- let ua_or_user_guard = UA_STYLESHEETS.shared_lock.read();
- let guards = StylesheetGuards {
- author: &author_guard,
- ua_or_user: &ua_or_user_guard,
- };
- let mut layout_context = self.build_layout_context(guards, &*rw_data, false);
-
if let Some(mut root_flow) = self.root_flow.clone() {
+ let reflow_info = Reflow {
+ goal: ReflowGoal::ForDisplay,
+ page_clip_rect: max_rect(),
+ };
+
+ // Unwrap here should not panic since self.root_flow is only ever set to Some(_)
+ // in handle_reflow() where self.document_shared_lock is as well.
+ let author_shared_lock = self.document_shared_lock.clone().unwrap();
+ let author_guard = author_shared_lock.read();
+ let ua_or_user_guard = UA_STYLESHEETS.shared_lock.read();
+ let guards = StylesheetGuards {
+ author: &author_guard,
+ ua_or_user: &ua_or_user_guard,
+ };
+ let mut layout_context = self.build_layout_context(guards, &*rw_data, false);
+
{
// Perform an abbreviated style recalc that operates without access to the DOM.
let animations = self.running_animations.read();
@@ -1380,8 +1388,8 @@ impl LayoutThread {
None,
&mut *rw_data,
&mut layout_context);
+ assert!(layout_context.pending_images.is_none());
}
- assert!(layout_context.pending_images.is_none());
}
fn perform_post_style_recalc_layout_passes(&mut self,
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index b875c75d837..7a50fe5cf6c 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -134,7 +134,6 @@ use style::attr::AttrValue;
use style::context::{QuirksMode, ReflowGoal};
use style::restyle_hints::{RestyleHint, RESTYLE_STYLE_ATTRIBUTE};
use style::selector_parser::{RestyleDamage, Snapshot};
-use style::servo::AUTHOR_SHARED_LOCK;
use style::shared_lock::SharedRwLock as StyleSharedRwLock;
use style::str::{HTML_SPACE_CHARACTERS, split_html_space_chars, str_join};
use style::stylesheets::Stylesheet;
@@ -2132,7 +2131,7 @@ impl Document {
scripts: Default::default(),
anchors: Default::default(),
applets: Default::default(),
- style_shared_lock: AUTHOR_SHARED_LOCK.clone(),
+ style_shared_lock: StyleSharedRwLock::new(),
stylesheets: DOMRefCell::new(None),
stylesheets_changed_since_reflow: Cell::new(false),
stylesheet_list: MutNullableJS::new(None),
diff --git a/components/style/servo/mod.rs b/components/style/servo/mod.rs
index ff6890658d3..ad741616eeb 100644
--- a/components/style/servo/mod.rs
+++ b/components/style/servo/mod.rs
@@ -9,13 +9,3 @@
pub mod media_queries;
pub mod restyle_damage;
pub mod selector_parser;
-
-use shared_lock::SharedRwLock;
-
-lazy_static! {
- /// Per-process shared lock for author-origin stylesheets
- ///
- /// FIXME: make it per-document or per-pipeline instead:
- /// https://github.com/servo/servo/issues/16027
- pub static ref AUTHOR_SHARED_LOCK: SharedRwLock = SharedRwLock::new();
-}