mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
Use parking_lot::RwLock instead of DOMRefCell for PropertyDeclarationBlock
This commit is contained in:
parent
d986fd2d2f
commit
89a29a7f12
24 changed files with 121 additions and 106 deletions
|
@ -51,6 +51,7 @@ net_traits = {path = "../net_traits"}
|
|||
num-traits = "0.1.32"
|
||||
offscreen_gl_context = "0.4"
|
||||
open = "1.1.1"
|
||||
parking_lot = "0.3"
|
||||
phf = "0.7.16"
|
||||
phf_macros = "0.7.16"
|
||||
plugins = {path = "../plugins"}
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use cssparser::ToCss;
|
||||
use dom::bindings::cell::DOMRefCell;
|
||||
use dom::bindings::codegen::Bindings::CSSStyleDeclarationBinding::{self, CSSStyleDeclarationMethods};
|
||||
use dom::bindings::error::{Error, ErrorResult, Fallible};
|
||||
use dom::bindings::global::GlobalRef;
|
||||
|
@ -14,6 +13,7 @@ use dom::bindings::str::DOMString;
|
|||
use dom::element::Element;
|
||||
use dom::node::{Node, NodeDamage, window_from_node};
|
||||
use dom::window::Window;
|
||||
use parking_lot::RwLock;
|
||||
use std::ascii::AsciiExt;
|
||||
use std::sync::Arc;
|
||||
use string_cache::Atom;
|
||||
|
@ -92,7 +92,7 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration {
|
|||
fn Length(&self) -> u32 {
|
||||
let elem = self.owner.upcast::<Element>();
|
||||
let len = match *elem.style_attribute().borrow() {
|
||||
Some(ref declarations) => declarations.borrow().declarations.len(),
|
||||
Some(ref declarations) => declarations.read().declarations.len(),
|
||||
None => 0,
|
||||
};
|
||||
len as u32
|
||||
|
@ -120,7 +120,7 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration {
|
|||
if let Some(shorthand) = Shorthand::from_name(&property) {
|
||||
let style_attribute = owner.style_attribute().borrow();
|
||||
let style_attribute = if let Some(ref style_attribute) = *style_attribute {
|
||||
style_attribute.borrow()
|
||||
style_attribute.read()
|
||||
} else {
|
||||
// shorthand.longhands() is never empty, so with no style attribute
|
||||
// step 2.2.2 would do this:
|
||||
|
@ -331,7 +331,7 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration {
|
|||
let elem = self.owner.upcast::<Element>();
|
||||
let style_attribute = elem.style_attribute().borrow();
|
||||
style_attribute.as_ref().and_then(|declarations| {
|
||||
declarations.borrow().declarations.get(index).map(|entry| {
|
||||
declarations.read().declarations.get(index).map(|entry| {
|
||||
let (ref declaration, importance) = *entry;
|
||||
let mut css = declaration.to_css_string();
|
||||
if importance.important() {
|
||||
|
@ -348,7 +348,7 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration {
|
|||
let style_attribute = elem.style_attribute().borrow();
|
||||
|
||||
if let Some(declarations) = style_attribute.as_ref() {
|
||||
DOMString::from(declarations.borrow().to_css_string())
|
||||
DOMString::from(declarations.read().to_css_string())
|
||||
} else {
|
||||
DOMString::new()
|
||||
}
|
||||
|
@ -370,7 +370,7 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration {
|
|||
*element.style_attribute().borrow_mut() = if decl_block.declarations.is_empty() {
|
||||
None // Step 2
|
||||
} else {
|
||||
Some(Arc::new(DOMRefCell::new(decl_block)))
|
||||
Some(Arc::new(RwLock::new(decl_block)))
|
||||
};
|
||||
element.sync_property_with_attrs_style();
|
||||
let node = element.upcast::<Node>();
|
||||
|
|
|
@ -70,6 +70,7 @@ use html5ever::serialize::SerializeOpts;
|
|||
use html5ever::serialize::TraversalScope;
|
||||
use html5ever::serialize::TraversalScope::{ChildrenOnly, IncludeNode};
|
||||
use html5ever::tree_builder::{LimitedQuirks, NoQuirks, Quirks};
|
||||
use parking_lot::RwLock;
|
||||
use selectors::matching::{ElementFlags, MatchingReason, matches};
|
||||
use selectors::matching::{HAS_EDGE_CHILD_SELECTOR, HAS_SLOW_SELECTOR, HAS_SLOW_SELECTOR_LATER_SIBLINGS};
|
||||
use selectors::parser::{AttrSelector, NamespaceConstraint, parse_author_origin_selector_list_from_str};
|
||||
|
@ -110,7 +111,7 @@ pub struct Element {
|
|||
attrs: DOMRefCell<Vec<JS<Attr>>>,
|
||||
id_attribute: DOMRefCell<Option<Atom>>,
|
||||
#[ignore_heap_size_of = "Arc"]
|
||||
style_attribute: DOMRefCell<Option<Arc<DOMRefCell<PropertyDeclarationBlock>>>>,
|
||||
style_attribute: DOMRefCell<Option<Arc<RwLock<PropertyDeclarationBlock>>>>,
|
||||
attr_list: MutNullableHeap<JS<NamedNodeMap>>,
|
||||
class_list: MutNullableHeap<JS<DOMTokenList>>,
|
||||
state: Cell<ElementState>,
|
||||
|
@ -298,7 +299,7 @@ pub trait LayoutElementHelpers {
|
|||
#[allow(unsafe_code)]
|
||||
unsafe fn html_element_in_html_document_for_layout(&self) -> bool;
|
||||
fn id_attribute(&self) -> *const Option<Atom>;
|
||||
fn style_attribute(&self) -> *const Option<Arc<DOMRefCell<PropertyDeclarationBlock>>>;
|
||||
fn style_attribute(&self) -> *const Option<Arc<RwLock<PropertyDeclarationBlock>>>;
|
||||
fn local_name(&self) -> &Atom;
|
||||
fn namespace(&self) -> &Namespace;
|
||||
fn get_checked_state_for_layout(&self) -> bool;
|
||||
|
@ -330,7 +331,7 @@ impl LayoutElementHelpers for LayoutJS<Element> {
|
|||
#[inline]
|
||||
fn from_declaration(rule: PropertyDeclaration) -> ApplicableDeclarationBlock {
|
||||
ApplicableDeclarationBlock::from_declarations(
|
||||
Arc::new(DOMRefCell::new(PropertyDeclarationBlock {
|
||||
Arc::new(RwLock::new(PropertyDeclarationBlock {
|
||||
declarations: vec![(rule, Importance::Normal)],
|
||||
important_count: 0,
|
||||
})),
|
||||
|
@ -619,7 +620,7 @@ impl LayoutElementHelpers for LayoutJS<Element> {
|
|||
}
|
||||
|
||||
#[allow(unsafe_code)]
|
||||
fn style_attribute(&self) -> *const Option<Arc<DOMRefCell<PropertyDeclarationBlock>>> {
|
||||
fn style_attribute(&self) -> *const Option<Arc<RwLock<PropertyDeclarationBlock>>> {
|
||||
unsafe {
|
||||
(*self.unsafe_get()).style_attribute.borrow_for_layout()
|
||||
}
|
||||
|
@ -708,7 +709,7 @@ impl Element {
|
|||
self.attrs.borrow()
|
||||
}
|
||||
|
||||
pub fn style_attribute(&self) -> &DOMRefCell<Option<Arc<DOMRefCell<PropertyDeclarationBlock>>>> {
|
||||
pub fn style_attribute(&self) -> &DOMRefCell<Option<Arc<RwLock<PropertyDeclarationBlock>>>> {
|
||||
&self.style_attribute
|
||||
}
|
||||
|
||||
|
@ -738,7 +739,7 @@ impl Element {
|
|||
// therefore, it should not trigger subsequent mutation events
|
||||
pub fn sync_property_with_attrs_style(&self) {
|
||||
let style_str = if let &Some(ref declarations) = &*self.style_attribute().borrow() {
|
||||
declarations.borrow().to_css_string()
|
||||
declarations.read().to_css_string()
|
||||
} else {
|
||||
String::new()
|
||||
};
|
||||
|
@ -770,7 +771,7 @@ impl Element {
|
|||
let mut inline_declarations = element.style_attribute.borrow_mut();
|
||||
if let &mut Some(ref mut declarations) = &mut *inline_declarations {
|
||||
let mut importance = None;
|
||||
let index = declarations.borrow().declarations.iter().position(|&(ref decl, i)| {
|
||||
let index = declarations.read().declarations.iter().position(|&(ref decl, i)| {
|
||||
let matching = decl.matches(property);
|
||||
if matching {
|
||||
importance = Some(i)
|
||||
|
@ -778,7 +779,7 @@ impl Element {
|
|||
matching
|
||||
});
|
||||
if let Some(index) = index {
|
||||
let mut declarations = Arc::make_mut(declarations).borrow_mut();
|
||||
let mut declarations = declarations.write();
|
||||
declarations.declarations.remove(index);
|
||||
if importance.unwrap().important() {
|
||||
declarations.important_count -= 1;
|
||||
|
@ -799,9 +800,7 @@ impl Element {
|
|||
let mut inline_declarations = element.style_attribute().borrow_mut();
|
||||
if let &mut Some(ref mut declaration_block) = &mut *inline_declarations {
|
||||
{
|
||||
// Usually, the reference count will be 1 here. But transitions could make it greater
|
||||
// than that.
|
||||
let mut declaration_block = Arc::make_mut(declaration_block).borrow_mut();
|
||||
let mut declaration_block = declaration_block.write();
|
||||
let declaration_block = &mut *declaration_block;
|
||||
let existing_declarations = &mut declaration_block.declarations;
|
||||
|
||||
|
@ -836,7 +835,7 @@ impl Element {
|
|||
0
|
||||
};
|
||||
|
||||
*inline_declarations = Some(Arc::new(DOMRefCell::new(PropertyDeclarationBlock {
|
||||
*inline_declarations = Some(Arc::new(RwLock::new(PropertyDeclarationBlock {
|
||||
declarations: declarations.into_iter().map(|d| (d, importance)).collect(),
|
||||
important_count: important_count,
|
||||
})));
|
||||
|
@ -852,9 +851,7 @@ impl Element {
|
|||
{
|
||||
let mut inline_declarations = self.style_attribute().borrow_mut();
|
||||
if let &mut Some(ref mut block) = &mut *inline_declarations {
|
||||
// Usually, the reference counts of `from` and `to` will be 1 here. But transitions
|
||||
// could make them greater than that.
|
||||
let mut block = Arc::make_mut(block).borrow_mut();
|
||||
let mut block = block.write();
|
||||
let block = &mut *block;
|
||||
let declarations = &mut block.declarations;
|
||||
for &mut (ref declaration, ref mut importance) in declarations {
|
||||
|
@ -881,7 +878,7 @@ impl Element {
|
|||
where F: FnOnce(Option<&(PropertyDeclaration, Importance)>) -> R {
|
||||
let style_attr = self.style_attribute.borrow();
|
||||
if let Some(ref block) = *style_attr {
|
||||
let block = block.borrow();
|
||||
let block = block.read();
|
||||
f(block.get(property))
|
||||
} else {
|
||||
f(None)
|
||||
|
@ -2131,7 +2128,7 @@ impl VirtualMethods for Element {
|
|||
*self.style_attribute.borrow_mut() =
|
||||
mutation.new_value(attr).map(|value| {
|
||||
let win = window_from_node(self);
|
||||
Arc::new(DOMRefCell::new(parse_style_attribute(
|
||||
Arc::new(RwLock::new(parse_style_attribute(
|
||||
&value,
|
||||
&doc.base_url(),
|
||||
win.css_error_reporter(),
|
||||
|
|
|
@ -30,7 +30,6 @@
|
|||
|
||||
#![allow(unsafe_code)]
|
||||
|
||||
use dom::bindings::cell::DOMRefCell;
|
||||
use dom::bindings::inheritance::{CharacterDataTypeId, ElementTypeId};
|
||||
use dom::bindings::inheritance::{HTMLElementTypeId, NodeTypeId};
|
||||
use dom::bindings::js::LayoutJS;
|
||||
|
@ -42,6 +41,7 @@ use dom::node::{LayoutNodeHelpers, Node};
|
|||
use dom::text::Text;
|
||||
use gfx_traits::ByteIndex;
|
||||
use msg::constellation_msg::PipelineId;
|
||||
use parking_lot::RwLock;
|
||||
use range::Range;
|
||||
use script_layout_interface::{HTMLCanvasData, LayoutNodeType, TrustedNodeAddress};
|
||||
use script_layout_interface::{OpaqueStyleAndLayoutData, PartialPersistentLayoutData};
|
||||
|
@ -462,7 +462,7 @@ impl<'le> TElement for ServoLayoutElement<'le> {
|
|||
ServoLayoutNode::from_layout_js(self.element.upcast())
|
||||
}
|
||||
|
||||
fn style_attribute(&self) -> Option<&Arc<DOMRefCell<PropertyDeclarationBlock>>> {
|
||||
fn style_attribute(&self) -> Option<&Arc<RwLock<PropertyDeclarationBlock>>> {
|
||||
unsafe {
|
||||
(*self.element.style_attribute()).as_ref()
|
||||
}
|
||||
|
|
|
@ -64,6 +64,7 @@ extern crate net_traits;
|
|||
extern crate num_traits;
|
||||
extern crate offscreen_gl_context;
|
||||
extern crate open;
|
||||
extern crate parking_lot;
|
||||
extern crate phf;
|
||||
#[macro_use]
|
||||
extern crate profile_traits;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue