mirror of
https://github.com/servo/servo.git
synced 2025-08-07 14:35:33 +01:00
style: Shrink maps if needed after stylist rebuilds
Hashbrown grows a lot sometimes making us waste a lot of memory. Shrink some of these maps after CascadeData rebuild / stylesheet collection invalidation. Differential Revision: https://phabricator.services.mozilla.com/D134716
This commit is contained in:
parent
f9610e5898
commit
fcc55f2156
6 changed files with 122 additions and 17 deletions
|
@ -41,7 +41,7 @@ use crate::stylesheets::{
|
|||
use crate::stylesheets::{StyleRule, StylesheetContents, StylesheetInDocument};
|
||||
use crate::thread_state::{self, ThreadState};
|
||||
use crate::AllocErr;
|
||||
use crate::{Atom, LocalName, Namespace, WeakAtom};
|
||||
use crate::{Atom, LocalName, Namespace, ShrinkIfNeeded, WeakAtom};
|
||||
use fxhash::FxHashMap;
|
||||
use malloc_size_of::MallocSizeOf;
|
||||
#[cfg(feature = "gecko")]
|
||||
|
@ -291,7 +291,7 @@ impl CascadeDataCacheEntry for UserAgentCascadeData {
|
|||
)?;
|
||||
}
|
||||
|
||||
new_data.cascade_data.compute_layer_order();
|
||||
new_data.cascade_data.did_finish_rebuild();
|
||||
|
||||
Ok(Arc::new(new_data))
|
||||
}
|
||||
|
@ -1978,6 +1978,15 @@ impl ElementAndPseudoRules {
|
|||
self.element_map.clear();
|
||||
self.pseudos_map.clear();
|
||||
}
|
||||
|
||||
fn shrink_if_needed(&mut self) {
|
||||
self.element_map.shrink_if_needed();
|
||||
for pseudo in self.pseudos_map.iter_mut() {
|
||||
if let Some(ref mut pseudo) = pseudo {
|
||||
pseudo.shrink_if_needed();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl PartElementAndPseudoRules {
|
||||
|
@ -2164,7 +2173,7 @@ impl CascadeData {
|
|||
result.is_ok()
|
||||
});
|
||||
|
||||
self.compute_layer_order();
|
||||
self.did_finish_rebuild();
|
||||
|
||||
result
|
||||
}
|
||||
|
@ -2232,6 +2241,27 @@ impl CascadeData {
|
|||
self.layers[id.0 as usize].order
|
||||
}
|
||||
|
||||
fn did_finish_rebuild(&mut self) {
|
||||
self.shrink_maps_if_needed();
|
||||
self.compute_layer_order();
|
||||
}
|
||||
|
||||
fn shrink_maps_if_needed(&mut self) {
|
||||
self.normal_rules.shrink_if_needed();
|
||||
if let Some(ref mut host_rules) = self.host_rules {
|
||||
host_rules.shrink_if_needed();
|
||||
}
|
||||
if let Some(ref mut slotted_rules) = self.slotted_rules {
|
||||
slotted_rules.shrink_if_needed();
|
||||
}
|
||||
self.invalidation_map.shrink_if_needed();
|
||||
self.attribute_dependencies.shrink_if_needed();
|
||||
self.mapped_ids.shrink_if_needed();
|
||||
self.layer_id.shrink_if_needed();
|
||||
self.selectors_for_cache_revalidation.shrink_if_needed();
|
||||
|
||||
}
|
||||
|
||||
fn compute_layer_order(&mut self) {
|
||||
debug_assert_ne!(
|
||||
self.layers.len(),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue