Merge pull request #2707 from glennw/image-cache-handle

Remove LocalImageCacheHandle hack and associated unsafe code.
This commit is contained in:
Lars Bergstrom 2014-06-23 08:32:39 -05:00
commit 1d0df6e65f
4 changed files with 14 additions and 57 deletions

View file

@ -14,9 +14,10 @@ use gfx::font_context::{FontContext, FontContextInfo};
use green::task::GreenTask; use green::task::GreenTask;
use script::layout_interface::LayoutChan; use script::layout_interface::LayoutChan;
use servo_msg::constellation_msg::ConstellationChan; use servo_msg::constellation_msg::ConstellationChan;
use servo_net::image::holder::LocalImageCacheHandle; use servo_net::local_image_cache::LocalImageCache;
use servo_util::geometry::Au; use servo_util::geometry::Au;
use servo_util::opts::Opts; use servo_util::opts::Opts;
use sync::{Arc, Mutex};
use std::mem; use std::mem;
#[cfg(not(target_os="android"))] #[cfg(not(target_os="android"))]
use std::ptr; use std::ptr;
@ -54,7 +55,7 @@ local_data_key!(style_sharing_candidate_cache: *mut StyleSharingCandidateCache)
#[deriving(Clone)] #[deriving(Clone)]
pub struct LayoutContext { pub struct LayoutContext {
/// The local image cache. /// The local image cache.
pub image_cache: LocalImageCacheHandle, pub image_cache: Arc<Mutex<LocalImageCache>>,
/// The current screen size. /// The current screen size.
pub screen_size: Size2D<Au>, pub screen_size: Size2D<Au>,

View file

@ -33,7 +33,8 @@ use gfx::font::FontStyle;
use gfx::text::glyph::CharIndex; use gfx::text::glyph::CharIndex;
use gfx::text::text_run::TextRun; use gfx::text::text_run::TextRun;
use servo_msg::constellation_msg::{ConstellationChan, FrameRectMsg, PipelineId, SubpageId}; use servo_msg::constellation_msg::{ConstellationChan, FrameRectMsg, PipelineId, SubpageId};
use servo_net::image::holder::{ImageHolder, LocalImageCacheHandle}; use servo_net::image::holder::ImageHolder;
use servo_net::local_image_cache::LocalImageCache;
use servo_util::geometry::Au; use servo_util::geometry::Au;
use servo_util::geometry; use servo_util::geometry;
use servo_util::range::*; use servo_util::range::*;
@ -49,7 +50,7 @@ use style::{ComputedValues, TElement, TNode, cascade_anonymous};
use style::computed_values::{LengthOrPercentageOrAuto, overflow, LPA_Auto, background_attachment}; use style::computed_values::{LengthOrPercentageOrAuto, overflow, LPA_Auto, background_attachment};
use style::computed_values::{background_repeat, border_style, clear, position, text_align}; use style::computed_values::{background_repeat, border_style, clear, position, text_align};
use style::computed_values::{text_decoration, vertical_align, visibility, white_space}; use style::computed_values::{text_decoration, vertical_align, visibility, white_space};
use sync::Arc; use sync::{Arc, Mutex};
use url::Url; use url::Url;
/// Fragments (`struct Fragment`) are the leaves of the layout tree. They cannot position themselves. In /// Fragments (`struct Fragment`) are the leaves of the layout tree. They cannot position themselves. In
@ -133,7 +134,7 @@ impl ImageFragmentInfo {
/// me. /// me.
pub fn new(node: &ThreadSafeLayoutNode, pub fn new(node: &ThreadSafeLayoutNode,
image_url: Url, image_url: Url,
local_image_cache: LocalImageCacheHandle) local_image_cache: Arc<Mutex<LocalImageCache>>)
-> ImageFragmentInfo { -> ImageFragmentInfo {
fn convert_length(node: &ThreadSafeLayoutNode, name: &str) -> Option<Au> { fn convert_length(node: &ThreadSafeLayoutNode, name: &str) -> Option<Au> {
let element = node.as_element(); let element = node.as_element();

View file

@ -43,7 +43,6 @@ use script::layout_interface::{ReflowForDisplay, ReflowMsg};
use script::script_task::{ReflowCompleteMsg, ScriptChan, SendEventMsg}; use script::script_task::{ReflowCompleteMsg, ScriptChan, SendEventMsg};
use servo_msg::compositor_msg::Scrollable; use servo_msg::compositor_msg::Scrollable;
use servo_msg::constellation_msg::{ConstellationChan, PipelineId, Failure, FailureMsg}; use servo_msg::constellation_msg::{ConstellationChan, PipelineId, Failure, FailureMsg};
use servo_net::image::holder::LocalImageCacheHandle;
use servo_net::image_cache_task::{ImageCacheTask, ImageResponseMsg}; use servo_net::image_cache_task::{ImageCacheTask, ImageResponseMsg};
use servo_net::local_image_cache::{ImageResponder, LocalImageCache}; use servo_net::local_image_cache::{ImageResponder, LocalImageCache};
use servo_util::geometry::Au; use servo_util::geometry::Au;
@ -86,7 +85,7 @@ pub struct LayoutTask {
pub image_cache_task: ImageCacheTask, pub image_cache_task: ImageCacheTask,
/// The local image cache. /// The local image cache.
pub local_image_cache: LocalImageCacheHandle, pub local_image_cache: Arc<Mutex<LocalImageCache>>,
/// The size of the viewport. /// The size of the viewport.
pub screen_size: Size2D<Au>, pub screen_size: Size2D<Au>,
@ -313,12 +312,7 @@ impl LayoutTask {
opts: &Opts, opts: &Opts,
profiler_chan: ProfilerChan) profiler_chan: ProfilerChan)
-> LayoutTask { -> LayoutTask {
let local_image_cache = box LocalImageCache(image_cache_task.clone()); let local_image_cache = Arc::new(Mutex::new(LocalImageCache(image_cache_task.clone())));
let local_image_cache = unsafe {
let cache = Arc::new(Mutex::new(
mem::transmute::<Box<LocalImageCache>, *()>(local_image_cache)));
LocalImageCacheHandle::new(mem::transmute::<Arc<Mutex<*()>>,Arc<*()>>(cache))
};
let screen_size = Size2D(Au(0), Au(0)); let screen_size = Size2D(Au(0), Au(0));
let parallel_traversal = if opts.layout_threads != 1 { let parallel_traversal = if opts.layout_threads != 1 {
Some(WorkQueue::new("LayoutWorker", opts.layout_threads, ptr::mut_null())) Some(WorkQueue::new("LayoutWorker", opts.layout_threads, ptr::mut_null()))
@ -570,7 +564,7 @@ impl LayoutTask {
{ {
// Reset the image cache. // Reset the image cache.
let mut local_image_cache = self.local_image_cache.get().lock(); let mut local_image_cache = self.local_image_cache.lock();
local_image_cache.next_round(self.make_on_image_available_cb()); local_image_cache.next_round(self.make_on_image_available_cb());
} }

View file

@ -8,7 +8,6 @@ use local_image_cache::LocalImageCache;
use geom::size::Size2D; use geom::size::Size2D;
use std::mem; use std::mem;
use std::ptr;
use sync::{Arc, Mutex}; use sync::{Arc, Mutex};
use url::Url; use url::Url;
@ -16,44 +15,6 @@ use url::Url;
// the network stack. This should probably be factored out into an interface and use dependency // the network stack. This should probably be factored out into an interface and use dependency
// injection. // injection.
/// An unfortunate hack to make this `Arc<Mutex>` `Share`.
pub struct LocalImageCacheHandle {
data: *uint,
}
impl Drop for LocalImageCacheHandle {
fn drop(&mut self) {
unsafe {
let _: Box<Arc<Mutex<Box<LocalImageCache>>>> =
mem::transmute(mem::replace(&mut self.data, ptr::null()));
}
}
}
impl Clone for LocalImageCacheHandle {
fn clone(&self) -> LocalImageCacheHandle {
unsafe {
let handle = mem::transmute::<&Arc<Mutex<Box<LocalImageCache>>>,&Arc<*()>>(self.get());
let new_handle = (*handle).clone();
LocalImageCacheHandle::new(new_handle)
}
}
}
impl LocalImageCacheHandle {
pub unsafe fn new(cache: Arc<*()>) -> LocalImageCacheHandle {
LocalImageCacheHandle {
data: mem::transmute(box cache),
}
}
pub fn get<'a>(&'a self) -> &'a Arc<Mutex<Box<LocalImageCache>>> {
unsafe {
mem::transmute::<*uint,&'a Arc<Mutex<Box<LocalImageCache>>>>(self.data)
}
}
}
/// A struct to store image data. The image will be loaded once the first time it is requested, /// A struct to store image data. The image will be loaded once the first time it is requested,
/// and an Arc will be stored. Clones of this Arc are given out on demand. /// and an Arc will be stored. Clones of this Arc are given out on demand.
#[deriving(Clone)] #[deriving(Clone)]
@ -61,11 +22,11 @@ pub struct ImageHolder {
url: Url, url: Url,
image: Option<Arc<Box<Image>>>, image: Option<Arc<Box<Image>>>,
cached_size: Size2D<int>, cached_size: Size2D<int>,
local_image_cache: LocalImageCacheHandle, local_image_cache: Arc<Mutex<LocalImageCache>>,
} }
impl ImageHolder { impl ImageHolder {
pub fn new(url: Url, local_image_cache: LocalImageCacheHandle) -> ImageHolder { pub fn new(url: Url, local_image_cache: Arc<Mutex<LocalImageCache>>) -> ImageHolder {
debug!("ImageHolder::new() {}", url.to_str()); debug!("ImageHolder::new() {}", url.to_str());
let holder = ImageHolder { let holder = ImageHolder {
url: url, url: url,
@ -80,7 +41,7 @@ impl ImageHolder {
// should be done as early as possible and decode only once we // should be done as early as possible and decode only once we
// are sure that the image will be used. // are sure that the image will be used.
{ {
let val = holder.local_image_cache.get().lock(); let val = holder.local_image_cache.lock();
let mut local_image_cache = val; let mut local_image_cache = val;
local_image_cache.prefetch(&holder.url); local_image_cache.prefetch(&holder.url);
local_image_cache.decode(&holder.url); local_image_cache.decode(&holder.url);
@ -120,7 +81,7 @@ impl ImageHolder {
// the image and store it for the future // the image and store it for the future
if self.image.is_none() { if self.image.is_none() {
let port = { let port = {
let val = self.local_image_cache.get().lock(); let val = self.local_image_cache.lock();
let mut local_image_cache = val; let mut local_image_cache = val;
local_image_cache.get_image(&self.url) local_image_cache.get_image(&self.url)
}; };