Skip to content

Commit 8ed35f1

Browse files
authored
script: Add basic memory pressure reporting to SpiderMonkey (#42180)
By reporting memory usage of rust objects back to SM it can trigger GC sooner and release more memory (I hope that we could use this to avoid OOB in webgpu in the future). Currently we use simple `size_of::<DomStruct>() + size_of::<Box<DomStruct>>()` but it's possible to override reported memory with `update_memory_size(self, nbytes);` on reflector. This is mostly useful for canvases and buffers which usually have large associated data. Testing: None, but I am wondering if we can connect this to `about:memory`. Fixes: #42168 --------- Signed-off-by: sagudev <[email protected]>
1 parent db052c4 commit 8ed35f1

29 files changed

+171
-25
lines changed

components/domobject_derive/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ fn expand_dom_object(input: syn::DeriveInput) -> proc_macro2::TokenStream {
5454
}
5555

5656
impl #impl_generics crate::MutDomObject for #name #ty_generics #where_clause {
57-
unsafe fn init_reflector(&self, obj: *mut js::jsapi::JSObject) {
58-
self.#first_field_name.init_reflector(obj);
57+
unsafe fn init_reflector<Actual>(&self, obj: *mut js::jsapi::JSObject) {
58+
self.#first_field_name.init_reflector::<Actual>(obj);
5959
}
6060
}
6161

components/script/dom/canvas/2d/canvasrenderingcontext2d.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use canvas_traits::canvas::{Canvas2dMsg, CanvasId};
77
use dom_struct::dom_struct;
88
use euclid::default::Size2D;
99
use pixels::Snapshot;
10+
use script_bindings::reflector::AssociatedMemory;
1011
use servo_url::ServoUrl;
1112
use webrender_api::ImageKey;
1213

@@ -39,7 +40,7 @@ use crate::script_runtime::CanGc;
3940
// https://html.spec.whatwg.org/multipage/#canvasrenderingcontext2d
4041
#[dom_struct]
4142
pub(crate) struct CanvasRenderingContext2D {
42-
reflector_: Reflector,
43+
reflector_: Reflector<AssociatedMemory>,
4344
canvas: HTMLCanvasElementOrOffscreenCanvas,
4445
canvas_state: CanvasState,
4546
}
@@ -110,6 +111,8 @@ impl CanvasContext for CanvasRenderingContext2D {
110111
}
111112

112113
fn resize(&self) {
114+
self.reflector_
115+
.update_memory_size(self, self.size().cast::<usize>().area());
113116
self.canvas_state.set_bitmap_dimensions(self.size().cast());
114117
}
115118

components/script/dom/promise.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ impl PromiseHelper for Rc<Promise> {
8585
impl Drop for Promise {
8686
#[expect(unsafe_code)]
8787
fn drop(&mut self) {
88+
let reflector = script_bindings::reflector::DomObject::reflector(self);
89+
reflector.drop_memory(self);
8890
unsafe {
8991
let object = self.permanent_js_root.get().to_object();
9092
assert!(!object.is_null());
@@ -140,7 +142,7 @@ impl Promise {
140142
permanent_js_root: Heap::default(),
141143
};
142144
let promise = Rc::new(promise);
143-
promise.init_reflector(obj.get());
145+
promise.init_reflector::<Promise>(obj.get());
144146
promise.initialize(cx);
145147
promise
146148
}

components/script/dom/webgl/webglquery.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,8 @@ impl WebGLQuery {
184184

185185
impl Drop for WebGLQuery {
186186
fn drop(&mut self) {
187+
let reflector = script_bindings::reflector::DomObject::reflector(self);
188+
reflector.drop_memory(self);
187189
self.delete(Operation::Fallible);
188190
}
189191
}

components/script/dom/webgl/webglrenderbuffer.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,8 @@ impl WebGLRenderbuffer {
280280

281281
impl Drop for WebGLRenderbuffer {
282282
fn drop(&mut self) {
283+
let reflector = script_bindings::reflector::DomObject::reflector(self);
284+
reflector.drop_memory(self);
283285
self.delete(Operation::Fallible);
284286
}
285287
}

components/script/dom/webgl/webglsampler.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,8 @@ impl WebGLSampler {
181181

182182
impl Drop for WebGLSampler {
183183
fn drop(&mut self) {
184+
let reflector = script_bindings::reflector::DomObject::reflector(self);
185+
reflector.drop_memory(self);
184186
self.delete(Operation::Fallible);
185187
}
186188
}

components/script/dom/webgl/webglshader.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,8 @@ impl WebGLShader {
283283

284284
impl Drop for WebGLShader {
285285
fn drop(&mut self) {
286+
let reflector = script_bindings::reflector::DomObject::reflector(self);
287+
reflector.drop_memory(self);
286288
self.mark_for_deletion(Operation::Fallible);
287289
}
288290
}

components/script/dom/webgl/webglsync.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ impl WebGLSync {
130130

131131
impl Drop for WebGLSync {
132132
fn drop(&mut self) {
133+
let reflector = script_bindings::reflector::DomObject::reflector(self);
134+
reflector.drop_memory(self);
133135
self.delete(Operation::Fallible);
134136
}
135137
}

components/script/dom/webgl/webgltexture.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,8 @@ impl WebGLTexture {
589589

590590
impl Drop for WebGLTexture {
591591
fn drop(&mut self) {
592+
let reflector = script_bindings::reflector::DomObject::reflector(self);
593+
reflector.drop_memory(self);
592594
self.delete(Operation::Fallible);
593595
}
594596
}

components/script/dom/webgl/webgltransformfeedback.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ impl WebGLTransformFeedback {
127127

128128
impl Drop for WebGLTransformFeedback {
129129
fn drop(&mut self) {
130+
let reflector = script_bindings::reflector::DomObject::reflector(self);
131+
reflector.drop_memory(self);
130132
self.delete(Operation::Fallible);
131133
}
132134
}

0 commit comments

Comments
 (0)