Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move the cache module out of util. #12311

Merged
merged 4 commits into from Jul 8, 2016
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

@@ -12,6 +12,7 @@ use smallvec::SmallVec;
use std::ascii::AsciiExt;
use std::borrow::ToOwned;
use std::cell::RefCell;
use std::collections::HashMap;
use std::rc::Rc;
use std::str;
use std::sync::Arc;
@@ -22,7 +23,6 @@ use text::glyph::{ByteIndex, GlyphData, GlyphId, GlyphStore};
use text::shaping::ShaperMethods;
use time;
use unicode_script::Script;
use util::cache::HashCache;
use webrender_traits;

macro_rules! ot_tag {
@@ -109,8 +109,8 @@ pub struct Font {
pub requested_pt_size: Au,
pub actual_pt_size: Au,
shaper: Option<Shaper>,
shape_cache: RefCell<HashCache<ShapeCacheEntry, Arc<GlyphStore>>>,
glyph_advance_cache: RefCell<HashCache<u32, FractionalPixel>>,
shape_cache: RefCell<HashMap<ShapeCacheEntry, Arc<GlyphStore>>>,
glyph_advance_cache: RefCell<HashMap<u32, FractionalPixel>>,
pub font_key: Option<webrender_traits::FontKey>,
}

@@ -130,8 +130,8 @@ impl Font {
requested_pt_size: requested_pt_size,
actual_pt_size: actual_pt_size,
metrics: metrics,
shape_cache: RefCell::new(HashCache::new()),
glyph_advance_cache: RefCell::new(HashCache::new()),
shape_cache: RefCell::new(HashMap::new()),
glyph_advance_cache: RefCell::new(HashMap::new()),
font_key: font_key,
}
}
@@ -180,7 +180,7 @@ impl Font {
text: text.to_owned(),
options: *options,
};
let result = self.shape_cache.borrow_mut().find_or_create(lookup_key, || {
let result = self.shape_cache.borrow_mut().entry(lookup_key).or_insert_with(|| {
let start_time = time::precise_time_ns();
let mut glyphs = GlyphStore::new(text.len(),
options.flags.contains(IS_WHITESPACE_SHAPING_FLAG),
@@ -201,7 +201,7 @@ impl Font {
TEXT_SHAPING_PERFORMANCE_COUNTER.fetch_add((end_time - start_time) as usize,
Ordering::Relaxed);
Arc::new(glyphs)
});
}).clone();
self.shaper = shaper;
result
}
@@ -269,7 +269,7 @@ impl Font {
}

pub fn glyph_h_advance(&self, glyph: GlyphId) -> FractionalPixel {
self.glyph_advance_cache.borrow_mut().find_or_create(glyph, || {
*self.glyph_advance_cache.borrow_mut().entry(glyph).or_insert_with(|| {
match self.handle.glyph_h_advance(glyph) {
Some(adv) => adv,
None => 10f64 as FractionalPixel // FIXME: Need fallback strategy

Some generated files are not rendered by default. Learn more.

@@ -498,7 +498,7 @@ where Impl: SelectorImplExt,
debug!("update_style_for_animation: entering");
debug_assert!(!animation.is_expired());
match *animation {
Animation::Transition(_, start_time, ref frame, expired) => {
Animation::Transition(_, start_time, ref frame, _) => {
debug!("update_style_for_animation: transition found");
let now = time::precise_time_s();
let mut new_style = (*style).clone();
@@ -2,60 +2,13 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

//! Two simple cache data structures.

use rand;
use rand::Rng;
use std::collections::HashMap;
use std::collections::hash_map::Entry::{Occupied, Vacant};
use std::default::Default;
use std::hash::{BuildHasherDefault, Hash, Hasher, SipHasher};
use std::hash::{Hash, Hasher, SipHasher};
use std::slice::Iter;


#[derive(Debug)]
pub struct HashCache<K, V>
where K: PartialEq + Eq + Hash,
V: Clone,
{
entries: HashMap<K, V, BuildHasherDefault<SipHasher>>,
}

impl<K, V> HashCache<K, V>
where K: PartialEq + Eq + Hash,
V: Clone,
{
pub fn new() -> HashCache<K, V> {
HashCache {
entries: HashMap::with_hasher(Default::default()),
}
}

pub fn insert(&mut self, key: K, value: V) {
self.entries.insert(key, value);
}

pub fn find(&self, key: &K) -> Option<V> {
match self.entries.get(key) {
Some(v) => Some(v.clone()),
None => None,
}
}

pub fn find_or_create<F>(&mut self, key: K, mut blk: F) -> V where F: FnMut() -> V {
match self.entries.entry(key) {
Occupied(occupied) => {
(*occupied.get()).clone()
}
Vacant(vacant) => {
(*vacant.insert(blk())).clone()
}
}
}

pub fn evict_all(&mut self) {
self.entries.clear();
}
}

pub struct LRUCache<K, V> {
entries: Vec<(K, V)>,
cache_size: usize,
@@ -72,6 +72,7 @@ extern crate util;
pub mod animation;
pub mod attr;
pub mod bezier;
pub mod cache;
pub mod context;
pub mod custom_properties;
pub mod data;
@@ -7,6 +7,7 @@
#![allow(unsafe_code)]

use animation::{self, Animation};
use cache::{LRUCache, SimpleHashCache};
use context::{StyleContext, SharedStyleContext};
use data::PrivateStyleData;
use dom::{TElement, TNode, TRestyleDamage};
@@ -25,7 +26,6 @@ use std::slice::Iter;
use std::sync::Arc;
use string_cache::{Atom, Namespace};
use util::arc_ptr_eq;
use util::cache::{LRUCache, SimpleHashCache};
use util::opts;

fn create_common_style_affecting_attributes_from_element<E: TElement>(element: &E)
@@ -24,7 +24,6 @@ ipc-channel = {git = "https://github.com/servo/ipc-channel", optional = true}
lazy_static = "0.2"
log = "0.3.5"
num_cpus = "0.2.2"
rand = "0.3"
rustc-serialize = "0.3"
serde = {version = "0.7.11", optional = true}
serde_macros = {version = "0.7.11", optional = true}
@@ -20,7 +20,6 @@ extern crate getopts;
#[allow(unused_extern_crates)] #[macro_use] extern crate lazy_static;
#[macro_use] extern crate log;
extern crate num_cpus;
extern crate rand;
extern crate rustc_serialize;
#[cfg(feature = "servo")] extern crate serde;
extern crate url;
@@ -30,7 +29,6 @@ extern crate xdg;
use std::sync::Arc;

pub mod basedir;
pub mod cache;
pub mod geometry;
#[cfg(feature = "servo")] #[allow(unsafe_code)] pub mod ipc;
#[allow(unsafe_code)] pub mod opts;

Some generated files are not rendered by default. Learn more.

Some generated files are not rendered by default. Learn more.

@@ -3,20 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

use std::cell::Cell;
use util::cache::{HashCache, LRUCache};

#[test]
fn test_hashcache() {
let mut cache: HashCache<usize, Cell<&str>> = HashCache::new();

cache.insert(1, Cell::new("one"));
assert!(cache.find(&1).is_some());
assert!(cache.find(&2).is_none());

cache.find_or_create(2, || { Cell::new("two") });
assert!(cache.find(&1).is_some());
assert!(cache.find(&2).is_some());
}
use style::cache::LRUCache;

#[test]
fn test_lru_cache() {
@@ -18,6 +18,7 @@ extern crate url;
extern crate util;

mod attr;
mod cache;
mod logical_geometry;
mod media_queries;
mod properties;
@@ -6,7 +6,6 @@

extern crate util;

mod cache;
mod opts;
mod prefs;
mod thread;
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.