From 99c2db05495b0185d9f8b7f1a077c896d247831e Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Thu, 7 Dec 2017 09:30:06 -0800 Subject: [PATCH 1/2] Update to uluru 0.2 and arrayvec 0.4 --- Cargo.lock | 40 +++++++------------ components/net/Cargo.toml | 2 +- components/style/Cargo.toml | 10 ++--- components/style/context.rs | 2 +- .../style/properties/properties.mako.rs | 4 +- components/style/sharing/mod.rs | 2 +- tests/unit/style/size_of.rs | 2 +- 7 files changed, 24 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index acf8dfff8ce..6d0ff61cfe9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -58,11 +58,10 @@ dependencies = [ [[package]] name = "arrayvec" -version = "0.3.23" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "nodrop 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "odds 0.2.25 (registry+https://github.com/rust-lang/crates.io-index)", + "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1341,10 +1340,10 @@ dependencies = [ [[package]] name = "immeta" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayvec 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1947,7 +1946,7 @@ dependencies = [ "hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)", "hyper-openssl 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "hyper_serde 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "immeta 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "immeta 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "ipc-channel 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2038,11 +2037,8 @@ dependencies = [ [[package]] name = "nodrop" -version = "0.1.8" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "odds 0.2.25 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "nom" @@ -2128,11 +2124,6 @@ dependencies = [ "objc 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "odds" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "offscreen_gl_context" version = "0.13.0" @@ -2923,7 +2914,7 @@ dependencies = [ name = "servo_arc" version = "0.0.1" dependencies = [ - "nodrop 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3122,7 +3113,7 @@ name = "style" version = "0.0.1" dependencies = [ "app_units 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", - "arrayvec 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "bindgen 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3165,7 +3156,7 @@ dependencies = [ "style_traits 0.0.1", "time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "uluru 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "uluru 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-bidi 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-segmentation 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3393,10 +3384,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "uluru" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayvec 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3763,7 +3754,7 @@ dependencies = [ "checksum ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6b3568b48b7cefa6b8ce125f9bb4989e52fbcc29ebea88df04cc7c5f12f70455" "checksum antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34fde25430d87a9388dadbe6e34d7f72a462c8b43ac8d309b42b0a8505d7e2a5" "checksum app_units 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ed0a4de09a3b8449515e649f3bb84f72ea15fc2d10639beb0776a09b7d308074" -"checksum arrayvec 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "699e63a93b79d717e8c3b5eb1b28b7780d0d6d9e59a72eb769291c83b0c8dc67" +"checksum arrayvec 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2f0ef4a9820019a0c91d918918c93dc71d469f581a49b47ddc1d285d4270bbe2" "checksum atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fb2dcb6e6d35f20276943cc04bb98e538b348d525a04ac79c10021561d202f21" "checksum atty 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "21e50800ec991574876040fff8ee46b136a53e985286fbe6a3bdfe6421b78860" "checksum audio-video-metadata 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "71536082079f5ba92c274fba7c2dcd4e2f9d5c13ce6d7f8fe9acbbb258916d18" @@ -3869,7 +3860,7 @@ dependencies = [ "checksum ident_case 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c9826188e666f2ed92071d2dadef6edc430b11b158b5b2b3f4babbcc891eaaa" "checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d" "checksum image 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d1576ffa01849c91b484b95c01d54dddc242b4d50923eaa2d4d74a58c4b9e8fd" -"checksum immeta 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0b9260463a221bfe3f02100c56e2d14c050d5ffe7e44a43d0a1b2b1f2b523502" +"checksum immeta 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1aaaa557fbc7323c857871ce15f2b2c08d90548cba4aabda4251fac1b4778337" "checksum inflate 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "10ec05638adf7c5c788bc0cfa608cd479a13572beda20feb4898fe1d85d2c64b" "checksum influent 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a22b311b83431be3ab9af96ca9ea41554bb4a8551ea871ae44c3ce0c57e55f2c" "checksum io-surface 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad4578cee6ed49a17766fa608a4425008313c55ebb7a267622cbddd6b01751e2" @@ -3912,7 +3903,7 @@ dependencies = [ "checksum mp4parse 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f821e3799bc0fd16d9b861fb02fa7ee1b5fba29f45ad591dade105c48ca9a1a0" "checksum mp4parse_capi 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "395247952fbdb68f933dc008927c635d3c87386af3bccd6fb7ae555137028449" "checksum net2 0.2.29 (registry+https://github.com/rust-lang/crates.io-index)" = "bc01404e7568680f1259aa5729539f221cb1e6d047a0d9053cab4be8a73b5d67" -"checksum nodrop 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0dbbadd3f4c98dea0bd3d9b4be4c0cdaf1ab57035cb2e41fce3983db5add7cc5" +"checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" "checksum nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b8c256fd9471521bcb84c3cdba98921497f1a331cbc15b8030fc63b82050ce" "checksum num-integer 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)" = "ef1a4bf6f9174aa5783a9b4cc892cacd11aebad6c69ad027a0b65c6ca5f8aa37" "checksum num-iter 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)" = "f7d1891bd7b936f12349b7d1403761c8a0b85a18b148e9da4429d5d102c1a41e" @@ -3922,7 +3913,6 @@ dependencies = [ "checksum objc 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "877f30f37acef6749b1841cceab289707f211aecfc756553cd63976190e6cc2e" "checksum objc-foundation 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" "checksum objc_id 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e4730aa1c64d722db45f7ccc4113a3e2c465d018de6db4d3e7dfe031e8c8a297" -"checksum odds 0.2.25 (registry+https://github.com/rust-lang/crates.io-index)" = "c3df9b730298cea3a1c3faa90b7e2f9df3a9c400d0936d6015e6165734eefcba" "checksum offscreen_gl_context 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b688b0c4cb779a362244ef5f6a14c87969cf94b0fde487820cac4cc75f851ff" "checksum ogg 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7137bf02687385302f4c0aecd77cfce052b69f5b4ee937be778e125c62f67e30" "checksum ogg_metadata 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fc665717454399cba557c55ad226148996e9266ee291f8a37a98bb2cded0a490" @@ -4018,7 +4008,7 @@ dependencies = [ "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" "checksum truetype 0.26.0 (registry+https://github.com/rust-lang/crates.io-index)" = "acec30350633d6dac9dc1a625786b6cbe9150664be941aac2c35ad7199eab877" "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" -"checksum uluru 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cd28fce445fd48f4e2c10ab0d3d8f6a646b11fd2b05228fa94fc83cf69ad6e98" +"checksum uluru 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "519130f0ea964ba540a9d8af1373738c2226f1d465eda07e61db29feb5479db9" "checksum unicase 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "13a5906ca2b98c799f4b1ab4557b76367ebd6ae5ef14930ec841c74aed5f3764" "checksum unicase 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2e01da42520092d0cd2d6ac3ae69eb21a22ad43ff195676b86f8c37f487d6b80" "checksum unicode-bidi 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a6a2c4e3710edd365cd7e78383153ed739fa31af19f9172f72d3575060f5a43a" diff --git a/components/net/Cargo.toml b/components/net/Cargo.toml index 4ed1e4037a2..23998be349d 100644 --- a/components/net/Cargo.toml +++ b/components/net/Cargo.toml @@ -18,7 +18,7 @@ flate2 = "0.2.0" hyper = "0.10" hyper_serde = "0.8" hyper-openssl = "0.2.2" -immeta = "0.3.1" +immeta = "0.3.6" ipc-channel = "0.9" lazy_static = "1" log = "0.3.5" diff --git a/components/style/Cargo.toml b/components/style/Cargo.toml index 030bef31787..27fe73b7327 100644 --- a/components/style/Cargo.toml +++ b/components/style/Cargo.toml @@ -20,17 +20,13 @@ gecko = ["nsstring", "num_cpus", "style_traits/gecko", "fallible/known_system_malloc"] use_bindgen = ["bindgen", "regex", "toml"] servo = ["serde", "style_traits/servo", "servo_atoms", "servo_config", "html5ever", - "cssparser/serde", "encoding_rs", "malloc_size_of/servo", - - # FIXME: Uncomment when https://github.com/servo/servo/pull/16953 has landed: - #"arrayvec/use_union" - + "cssparser/serde", "encoding_rs", "malloc_size_of/servo", "arrayvec/use_union", "servo_url"] gecko_debug = ["nsstring/gecko_debug"] [dependencies] app_units = "0.5.5" -arrayvec = "0.3.20" +arrayvec = "0.4.6" atomic_refcell = "0.1" bitflags = "1.0" byteorder = "1.0" @@ -69,7 +65,7 @@ style_derive = {path = "../style_derive"} style_traits = {path = "../style_traits"} servo_url = {path = "../url", optional = true} time = "0.1" -uluru = "0.1" +uluru = "0.2" unicode-bidi = "0.3" unicode-segmentation = "1.0" diff --git a/components/style/context.rs b/components/style/context.rs index 8ee9f197841..1b233fb7af2 100644 --- a/components/style/context.rs +++ b/components/style/context.rs @@ -515,7 +515,7 @@ pub struct SelectorFlagsMap { map: FnvHashMap, ElementSelectorFlags>, /// An LRU cache to avoid hashmap lookups, which can be slow if the map /// gets big. - cache: LRUCache, [Entry>; 4 + 1]>, + cache: LRUCache<[Entry>; 4 + 1]>, } #[cfg(debug_assertions)] diff --git a/components/style/properties/properties.mako.rs b/components/style/properties/properties.mako.rs index fadde00e003..4c05a1541f4 100644 --- a/components/style/properties/properties.mako.rs +++ b/components/style/properties/properties.mako.rs @@ -1809,8 +1809,8 @@ impl SourcePropertyDeclaration { } fn push(&mut self, declaration: PropertyDeclaration) { - let over_capacity = self.declarations.push(declaration).is_some(); - debug_assert!(!over_capacity); + let _result = self.declarations.try_push(declaration); + debug_assert!(_result.is_ok()); } } diff --git a/components/style/sharing/mod.rs b/components/style/sharing/mod.rs index 79ddd58dfce..6a2e16a1177 100644 --- a/components/style/sharing/mod.rs +++ b/components/style/sharing/mod.rs @@ -421,7 +421,7 @@ impl StyleSharingTarget { } struct SharingCacheBase { - entries: LRUCache; SHARING_CACHE_BACKING_STORE_SIZE]>, + entries: LRUCache<[Entry; SHARING_CACHE_BACKING_STORE_SIZE]>, } impl Default for SharingCacheBase { diff --git a/tests/unit/style/size_of.rs b/tests/unit/style/size_of.rs index d9cc10dd28c..1078074fa58 100644 --- a/tests/unit/style/size_of.rs +++ b/tests/unit/style/size_of.rs @@ -12,7 +12,7 @@ size_of_test!(test_size_of_property_declaration, properties::PropertyDeclaration // This is huge, but we allocate it on the stack and then never move it, // we only pass `&mut SourcePropertyDeclaration` references around. -size_of_test!(test_size_of_parsed_declaration, properties::SourcePropertyDeclaration, 576); +size_of_test!(test_size_of_parsed_declaration, properties::SourcePropertyDeclaration, 568); size_of_test!(test_size_of_selector_parse_error_kind, SelectorParseErrorKind, 40); size_of_test!(test_size_of_style_parse_error_kind, ::style_traits::StyleParseErrorKind, 56); From 1f22041f5f980446e102c2a709404999ad57aee8 Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Thu, 7 Dec 2017 09:54:43 -0800 Subject: [PATCH 2/2] Improve LRU cache behavior in SelectorFlagsMap This code used to insert duplicate entries to avoid expensive shuffling of the LRU cache. With uluru this is no longer necessary, because reordering the cache is cheap. Now it uses the `LRUCache::find` method from uluru 0.2 to update entries in-place. This should improve the hit rate, because it eliminates unnecessary evictions. --- components/style/context.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/components/style/context.rs b/components/style/context.rs index 1b233fb7af2..7843c424046 100644 --- a/components/style/context.rs +++ b/components/style/context.rs @@ -538,17 +538,17 @@ impl SelectorFlagsMap { pub fn insert_flags(&mut self, element: E, flags: ElementSelectorFlags) { let el = unsafe { SendElement::new(element) }; // Check the cache. If the flags have already been noted, we're done. - if self.cache.iter().find(|&(_, ref x)| x.0 == el) - .map_or(ElementSelectorFlags::empty(), |(_, x)| x.1) - .contains(flags) { + if let Some(item) = self.cache.find(|x| x.0 == el) { + if !item.1.contains(flags) { + item.1.insert(flags); + self.map.get_mut(&el).unwrap().insert(flags); + } return; } let f = self.map.entry(el).or_insert(ElementSelectorFlags::empty()); *f |= flags; - // Insert into the cache. We don't worry about duplicate entries, - // which lets us avoid reshuffling. self.cache.insert((unsafe { SendElement::new(element) }, *f)) }