Wrap SharedLayoutContext::stylist in a wrapper to make it Sync.

This commit is contained in:
Ms2ger 2015-11-06 23:15:41 +01:00
parent e9b77628ce
commit 647232a495
3 changed files with 10 additions and 5 deletions

View file

@ -74,6 +74,12 @@ fn create_or_get_local_context(shared_layout_context: &SharedLayoutContext)
}) })
} }
pub struct StylistWrapper(pub *const Stylist);
// FIXME(#6569) This implementation is unsound.
#[allow(unsafe_code)]
unsafe impl Sync for StylistWrapper {}
/// Layout information shared among all workers. This must be thread-safe. /// Layout information shared among all workers. This must be thread-safe.
pub struct SharedLayoutContext { pub struct SharedLayoutContext {
/// The shared image cache task. /// The shared image cache task.
@ -94,7 +100,7 @@ pub struct SharedLayoutContext {
/// The CSS selector stylist. /// The CSS selector stylist.
/// ///
/// FIXME(#2604): Make this no longer an unsafe pointer once we have fast `RWArc`s. /// FIXME(#2604): Make this no longer an unsafe pointer once we have fast `RWArc`s.
pub stylist: *const Stylist, pub stylist: StylistWrapper,
/// The URL. /// The URL.
pub url: Url, pub url: Url,
@ -122,7 +128,6 @@ pub struct SharedLayoutContext {
// FIXME(#6569) This implementations is unsound: // FIXME(#6569) This implementations is unsound:
// XXX UNSOUND!!! for image_cache_task // XXX UNSOUND!!! for image_cache_task
// XXX UNSOUND!!! for stylist
#[allow(unsafe_code)] #[allow(unsafe_code)]
unsafe impl Sync for SharedLayoutContext {} unsafe impl Sync for SharedLayoutContext {}

View file

@ -12,7 +12,7 @@ use app_units::Au;
use azure::azure::AzColor; use azure::azure::AzColor;
use canvas_traits::CanvasMsg; use canvas_traits::CanvasMsg;
use construct::ConstructionResult; use construct::ConstructionResult;
use context::{SharedLayoutContext, heap_size_of_local_context}; use context::{SharedLayoutContext, StylistWrapper, heap_size_of_local_context};
use cssparser::ToCss; use cssparser::ToCss;
use data::LayoutDataWrapper; use data::LayoutDataWrapper;
use display_list_builder::ToGfxColor; use display_list_builder::ToGfxColor;
@ -457,7 +457,7 @@ impl LayoutTask {
screen_size_changed: screen_size_changed, screen_size_changed: screen_size_changed,
font_cache_task: Mutex::new(self.font_cache_task.clone()), font_cache_task: Mutex::new(self.font_cache_task.clone()),
canvas_layers_sender: Mutex::new(self.canvas_layers_sender.clone()), canvas_layers_sender: Mutex::new(self.canvas_layers_sender.clone()),
stylist: &*rw_data.stylist, stylist: StylistWrapper(&*rw_data.stylist),
url: (*url).clone(), url: (*url).clone(),
visible_rects: rw_data.visible_rects.clone(), visible_rects: rw_data.visible_rects.clone(),
generation: rw_data.generation, generation: rw_data.generation,

View file

@ -188,7 +188,7 @@ impl<'a> PreorderDomTraversal for RecalcStyleForNode<'a> {
let shareable_element = match node.as_element() { let shareable_element = match node.as_element() {
Some(element) => { Some(element) => {
// Perform the CSS selector matching. // Perform the CSS selector matching.
let stylist = unsafe { &*self.layout_context.shared.stylist }; let stylist = unsafe { &*self.layout_context.shared.stylist.0 };
if element.match_element(stylist, if element.match_element(stylist,
Some(&*bf), Some(&*bf),
&mut applicable_declarations) { &mut applicable_declarations) {