layout: Report memory usage for fragment and box trees. (#36553)

Add memory reporter integration for the fragment and box trees that are
persisted in the layout thread.

Testing: Looked at the numbers for https://servo.org and
https://html.spec.whatwg.org/. The former was very small, but the latter
was 700mb.

---------

Signed-off-by: Josh Matthews <josh@joshmatthews.net>
This commit is contained in:
Josh Matthews 2025-04-18 16:05:15 -04:00 committed by GitHub
parent add8c51f47
commit c787688afc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
33 changed files with 230 additions and 69 deletions

View file

@ -13,6 +13,7 @@ path = "lib.rs"
[dependencies]
accountable-refcell = { workspace = true }
app_units = { workspace = true }
atomic_refcell = { workspace = true }
content-security-policy = { workspace = true }
crossbeam-channel = { workspace = true }
euclid = { workspace = true }
@ -28,8 +29,11 @@ string_cache = { workspace = true }
stylo = { workspace = true }
stylo_dom = { workspace = true }
stylo_malloc_size_of = { workspace = true }
taffy = { workspace = true }
thin-vec = { workspace = true }
tokio = { workspace = true, features = ["sync"] }
unicode-bidi = { workspace = true }
unicode-script = { workspace = true }
url = { workspace = true }
uuid = { workspace = true }
webrender_api = { workspace = true }

View file

@ -52,6 +52,7 @@ use std::hash::{BuildHasher, Hash};
use std::ops::Range;
use std::sync::Arc;
use style::values::generics::length::GenericLengthPercentageOrAuto;
pub use stylo_malloc_size_of::MallocSizeOfOps;
use uuid::Uuid;
@ -219,6 +220,26 @@ where
}
}
impl<T: MallocConditionalSizeOf> MallocConditionalSizeOf for Option<T> {
fn conditional_size_of(&self, ops: &mut MallocSizeOfOps) -> usize {
if let Some(val) = self.as_ref() {
val.conditional_size_of(ops)
} else {
0
}
}
}
impl<T: MallocConditionalSizeOf> MallocConditionalSizeOf for Vec<T> {
fn conditional_size_of(&self, ops: &mut MallocSizeOfOps) -> usize {
let mut n = self.shallow_size_of(ops);
for elem in self.iter() {
n += elem.conditional_size_of(ops);
}
n
}
}
impl<T: MallocSizeOf> MallocSizeOf for Option<T> {
fn size_of(&self, ops: &mut MallocSizeOfOps) -> usize {
if let Some(val) = self.as_ref() {
@ -726,7 +747,11 @@ malloc_size_of_is_0!(std::time::Duration);
malloc_size_of_is_0!(std::time::Instant);
malloc_size_of_is_0!(std::time::SystemTime);
malloc_size_of_is_0!(style::font_face::SourceList);
malloc_size_of_is_0!(style::properties::ComputedValues);
malloc_size_of_is_0!(style::queries::values::PrefersColorScheme);
malloc_size_of_is_0!(taffy::Layout);
malloc_size_of_is_0!(unicode_bidi::Level);
malloc_size_of_is_0!(unicode_script::Script);
macro_rules! malloc_size_of_is_webrender_malloc_size_of(
($($ty:ty),+) => (
@ -790,6 +815,12 @@ where
}
}
impl<T: MallocSizeOf> MallocSizeOf for atomic_refcell::AtomicRefCell<T> {
fn size_of(&self, ops: &mut MallocSizeOfOps) -> usize {
self.borrow().size_of(ops)
}
}
malloc_size_of_is_stylo_malloc_size_of!(style::animation::DocumentAnimationSet);
malloc_size_of_is_stylo_malloc_size_of!(style::attr::AttrIdentifier);
malloc_size_of_is_stylo_malloc_size_of!(style::attr::AttrValue);
@ -797,7 +828,15 @@ malloc_size_of_is_stylo_malloc_size_of!(style::color::AbsoluteColor);
malloc_size_of_is_stylo_malloc_size_of!(style::computed_values::font_variant_caps::T);
malloc_size_of_is_stylo_malloc_size_of!(style::dom::OpaqueNode);
malloc_size_of_is_stylo_malloc_size_of!(style::invalidation::element::restyle_hints::RestyleHint);
malloc_size_of_is_stylo_malloc_size_of!(style::logical_geometry::WritingMode);
malloc_size_of_is_stylo_malloc_size_of!(style::media_queries::MediaList);
malloc_size_of_is_stylo_malloc_size_of!(
style::properties::longhands::align_items::computed_value::T
);
malloc_size_of_is_stylo_malloc_size_of!(
style::properties::longhands::flex_direction::computed_value::T
);
malloc_size_of_is_stylo_malloc_size_of!(style::properties::longhands::flex_wrap::computed_value::T);
malloc_size_of_is_stylo_malloc_size_of!(style::properties::style_structs::Font);
malloc_size_of_is_stylo_malloc_size_of!(style::selector_parser::PseudoElement);
malloc_size_of_is_stylo_malloc_size_of!(style::selector_parser::RestyleDamage);
@ -805,8 +844,22 @@ malloc_size_of_is_stylo_malloc_size_of!(style::selector_parser::Snapshot);
malloc_size_of_is_stylo_malloc_size_of!(style::shared_lock::SharedRwLock);
malloc_size_of_is_stylo_malloc_size_of!(style::stylesheets::DocumentStyleSheet);
malloc_size_of_is_stylo_malloc_size_of!(style::stylist::Stylist);
malloc_size_of_is_stylo_malloc_size_of!(style::values::computed::AlignContent);
malloc_size_of_is_stylo_malloc_size_of!(style::values::computed::BorderStyle);
malloc_size_of_is_stylo_malloc_size_of!(style::values::computed::FontStretch);
malloc_size_of_is_stylo_malloc_size_of!(style::values::computed::FontStyle);
malloc_size_of_is_stylo_malloc_size_of!(style::values::computed::FontWeight);
malloc_size_of_is_stylo_malloc_size_of!(style::values::computed::font::SingleFontFamily);
malloc_size_of_is_stylo_malloc_size_of!(style::values::computed::JustifyContent);
malloc_size_of_is_stylo_malloc_size_of!(style::values::specified::align::AlignFlags);
malloc_size_of_is_stylo_malloc_size_of!(style::values::specified::TextDecorationLine);
malloc_size_of_is_stylo_malloc_size_of!(stylo_dom::ElementState);
impl<T> MallocSizeOf for GenericLengthPercentageOrAuto<T>
where
T: stylo_malloc_size_of::MallocSizeOf,
{
fn size_of(&self, ops: &mut MallocSizeOfOps) -> usize {
<GenericLengthPercentageOrAuto<T> as stylo_malloc_size_of::MallocSizeOf>::size_of(self, ops)
}
}