mirror of
https://github.com/servo/servo.git
synced 2025-09-04 20:18:21 +01:00
script_bindings: Remove Cell wrapper from thread-local RootCollection. (#39043)
This doesn't appear to make a big difference in speedometer results, but this removes some code from the hot path of creating DomRoot values. Before: `Score: 30.381097406624708 ± 2.0393225244958018` After: `Score: 30.344639420871395 ± 1.9359337921154696` Testing: Existing WPT coverage Signed-off-by: Josh Matthews <josh@joshmatthews.net>
This commit is contained in:
parent
d3c5a8ec15
commit
0481477f35
6 changed files with 9 additions and 37 deletions
|
@ -27,7 +27,6 @@
|
|||
use std::cell::{OnceCell, UnsafeCell};
|
||||
use std::default::Default;
|
||||
use std::hash::{Hash, Hasher};
|
||||
use std::marker::PhantomData;
|
||||
use std::{mem, ptr};
|
||||
|
||||
use js::jsapi::{Heap, JSObject, JSTracer, Value};
|
||||
|
@ -43,21 +42,6 @@ use crate::dom::bindings::reflector::DomObject;
|
|||
use crate::dom::bindings::trace::JSTraceable;
|
||||
use crate::dom::node::Node;
|
||||
|
||||
pub(crate) struct ThreadLocalStackRoots<'a>(PhantomData<&'a u32>);
|
||||
|
||||
impl<'a> ThreadLocalStackRoots<'a> {
|
||||
pub(crate) fn new(roots: &'a RootCollection) -> Self {
|
||||
STACK_ROOTS.with(|r| r.set(Some(roots)));
|
||||
ThreadLocalStackRoots(PhantomData)
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for ThreadLocalStackRoots<'_> {
|
||||
fn drop(&mut self) {
|
||||
STACK_ROOTS.with(|r| r.set(None));
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) trait ToLayout<T> {
|
||||
/// Returns `LayoutDom<T>` containing the same pointer.
|
||||
///
|
||||
|
|
|
@ -40,7 +40,7 @@ use crate::dom::bindings::codegen::Bindings::WorkerBinding::WorkerType;
|
|||
use crate::dom::bindings::error::{ErrorInfo, ErrorResult};
|
||||
use crate::dom::bindings::inheritance::Castable;
|
||||
use crate::dom::bindings::reflector::DomGlobal;
|
||||
use crate::dom::bindings::root::{DomRoot, RootCollection, ThreadLocalStackRoots};
|
||||
use crate::dom::bindings::root::DomRoot;
|
||||
use crate::dom::bindings::str::DOMString;
|
||||
use crate::dom::bindings::structuredclone;
|
||||
use crate::dom::bindings::trace::{CustomTraceable, RootedTraceableBox};
|
||||
|
@ -396,9 +396,6 @@ impl DedicatedWorkerGlobalScope {
|
|||
WebViewId::install(webview_id);
|
||||
}
|
||||
|
||||
let roots = RootCollection::new();
|
||||
let _stack_roots = ThreadLocalStackRoots::new(&roots);
|
||||
|
||||
let WorkerScriptLoadOrigin {
|
||||
referrer_url,
|
||||
referrer_policy,
|
||||
|
|
|
@ -35,7 +35,7 @@ use crate::dom::bindings::codegen::Bindings::ServiceWorkerGlobalScopeBinding;
|
|||
use crate::dom::bindings::codegen::Bindings::ServiceWorkerGlobalScopeBinding::ServiceWorkerGlobalScopeMethods;
|
||||
use crate::dom::bindings::codegen::Bindings::WorkerBinding::WorkerType;
|
||||
use crate::dom::bindings::inheritance::Castable;
|
||||
use crate::dom::bindings::root::{DomRoot, RootCollection, ThreadLocalStackRoots};
|
||||
use crate::dom::bindings::root::DomRoot;
|
||||
use crate::dom::bindings::str::DOMString;
|
||||
use crate::dom::bindings::structuredclone;
|
||||
use crate::dom::bindings::trace::CustomTraceable;
|
||||
|
@ -317,9 +317,6 @@ impl ServiceWorkerGlobalScope {
|
|||
let context_for_interrupt = runtime.thread_safe_js_context();
|
||||
let _ = context_sender.send(context_for_interrupt);
|
||||
|
||||
let roots = RootCollection::new();
|
||||
let _stack_roots = ThreadLocalStackRoots::new(&roots);
|
||||
|
||||
let WorkerScriptLoadOrigin {
|
||||
referrer_url,
|
||||
referrer_policy,
|
||||
|
|
|
@ -38,7 +38,7 @@ use crate::dom::bindings::error::Error;
|
|||
use crate::dom::bindings::inheritance::Castable;
|
||||
use crate::dom::bindings::refcounted::TrustedPromise;
|
||||
use crate::dom::bindings::reflector::{DomGlobal, Reflector, reflect_dom_object};
|
||||
use crate::dom::bindings::root::{Dom, DomRoot, RootCollection, ThreadLocalStackRoots};
|
||||
use crate::dom::bindings::root::{Dom, DomRoot};
|
||||
use crate::dom::bindings::str::USVString;
|
||||
use crate::dom::bindings::trace::{CustomTraceable, JSTraceable, RootedTraceableBox};
|
||||
use crate::dom::csp::Violation;
|
||||
|
@ -495,8 +495,6 @@ impl WorkletThread {
|
|||
// TODO: configure the JS runtime (e.g. discourage GC, encourage agressive JIT)
|
||||
debug!("Initializing worklet thread.");
|
||||
thread_state::initialize(ThreadState::SCRIPT | ThreadState::IN_WORKER);
|
||||
let roots = RootCollection::new();
|
||||
let _stack_roots = ThreadLocalStackRoots::new(&roots);
|
||||
let mut thread = RootedTraceableBox::new(WorkletThread {
|
||||
role,
|
||||
control_receiver,
|
||||
|
|
|
@ -111,7 +111,7 @@ use crate::dom::bindings::conversions::{
|
|||
use crate::dom::bindings::inheritance::Castable;
|
||||
use crate::dom::bindings::refcounted::Trusted;
|
||||
use crate::dom::bindings::reflector::DomGlobal;
|
||||
use crate::dom::bindings::root::{Dom, DomRoot, RootCollection, ThreadLocalStackRoots};
|
||||
use crate::dom::bindings::root::{Dom, DomRoot};
|
||||
use crate::dom::bindings::settings_stack::AutoEntryScript;
|
||||
use crate::dom::bindings::str::DOMString;
|
||||
use crate::dom::bindings::trace::{HashMapTracedValues, JSTraceable};
|
||||
|
@ -415,8 +415,6 @@ impl ScriptThreadFactory for ScriptThread {
|
|||
thread_state::initialize(ThreadState::SCRIPT | ThreadState::LAYOUT);
|
||||
PipelineNamespace::install(state.pipeline_namespace_id);
|
||||
WebViewId::install(state.webview_id);
|
||||
let roots = RootCollection::new();
|
||||
let _stack_roots = ThreadLocalStackRoots::new(&roots);
|
||||
let memory_profiler_sender = state.memory_profiler_sender.clone();
|
||||
|
||||
let in_progress_load = InProgressLoad::new(
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use std::cell::{Cell, UnsafeCell};
|
||||
use std::cell::UnsafeCell;
|
||||
use std::hash::{Hash, Hasher};
|
||||
use std::ops::Deref;
|
||||
use std::{fmt, mem, ptr};
|
||||
|
@ -40,9 +40,8 @@ where
|
|||
unsafe fn add_to_root_list(object: *const dyn JSTraceable) -> *const RootCollection {
|
||||
assert_in_script();
|
||||
STACK_ROOTS.with(|root_list| {
|
||||
let root_list = unsafe { &*root_list.get().unwrap() };
|
||||
unsafe { root_list.root(object) };
|
||||
root_list
|
||||
root_list as *const _
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -390,8 +389,7 @@ pub struct RootCollection {
|
|||
impl RootCollection {
|
||||
/// Create an empty collection of roots
|
||||
#[allow(clippy::new_without_default)]
|
||||
pub fn new() -> RootCollection {
|
||||
assert_in_script();
|
||||
pub const fn new() -> RootCollection {
|
||||
RootCollection {
|
||||
roots: UnsafeCell::new(vec![]),
|
||||
}
|
||||
|
@ -419,7 +417,7 @@ impl RootCollection {
|
|||
}
|
||||
}
|
||||
|
||||
thread_local!(pub static STACK_ROOTS: Cell<Option<*const RootCollection>> = const { Cell::new(None) });
|
||||
thread_local!(pub static STACK_ROOTS: RootCollection = const { RootCollection::new() });
|
||||
|
||||
/// SM Callback that traces the rooted reflectors
|
||||
///
|
||||
|
@ -428,7 +426,7 @@ thread_local!(pub static STACK_ROOTS: Cell<Option<*const RootCollection>> = cons
|
|||
pub unsafe fn trace_roots(tracer: *mut JSTracer) {
|
||||
trace!("tracing stack roots");
|
||||
STACK_ROOTS.with(|collection| {
|
||||
let collection = unsafe { &*(*collection.get().unwrap()).roots.get() };
|
||||
let collection = unsafe { &*collection.roots.get() };
|
||||
for root in collection {
|
||||
unsafe {
|
||||
(**root).trace(tracer);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue