From 8d566fbc3c1954b2da0b0e185e224d5bde99b8e3 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Wed, 27 Sep 2017 13:58:59 +0200 Subject: [PATCH] Move script_runtime::StackRootTLS to root::ThreadLocalStackRoots --- components/script/dom/bindings/root.rs | 18 +++++++++++++++ .../script/dom/dedicatedworkerglobalscope.rs | 6 ++--- .../script/dom/serviceworkerglobalscope.rs | 6 ++--- components/script/dom/worklet.rs | 5 ++--- components/script/script_runtime.rs | 22 ++----------------- components/script/script_thread.rs | 6 ++--- 6 files changed, 31 insertions(+), 32 deletions(-) diff --git a/components/script/dom/bindings/root.rs b/components/script/dom/bindings/root.rs index 6f1dbcc2735..9f10fc87f2a 100644 --- a/components/script/dom/bindings/root.rs +++ b/components/script/dom/bindings/root.rs @@ -41,6 +41,7 @@ use std::default::Default; use std::hash::{Hash, Hasher}; #[cfg(debug_assertions)] use std::intrinsics::type_name; +use std::marker::PhantomData; use std::mem; use std::ops::Deref; use std::ptr; @@ -165,6 +166,23 @@ impl Clone for RootCollectionPtr { } } +pub struct ThreadLocalStackRoots<'a>(PhantomData<&'a u32>); + +impl<'a> ThreadLocalStackRoots<'a> { + pub fn new(roots: &'a RootCollection) -> Self { + STACK_ROOTS.with(|ref r| { + r.set(Some(RootCollectionPtr(roots as *const _))) + }); + ThreadLocalStackRoots(PhantomData) + } +} + +impl<'a> Drop for ThreadLocalStackRoots<'a> { + fn drop(&mut self) { + STACK_ROOTS.with(|ref r| r.set(None)); + } +} + impl RootCollection { /// Create an empty collection of roots pub fn new() -> RootCollection { diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index 118f2d32887..dc816aca637 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -12,7 +12,7 @@ use dom::bindings::codegen::Bindings::DedicatedWorkerGlobalScopeBinding::Dedicat use dom::bindings::error::{ErrorInfo, ErrorResult}; use dom::bindings::inheritance::Castable; use dom::bindings::reflector::DomObject; -use dom::bindings::root::{DomRoot, RootCollection}; +use dom::bindings::root::{DomRoot, RootCollection, ThreadLocalStackRoots}; use dom::bindings::str::DOMString; use dom::bindings::structuredclone::StructuredCloneData; use dom::errorevent::ErrorEvent; @@ -32,7 +32,7 @@ use js::rust::Runtime; use msg::constellation_msg::TopLevelBrowsingContextId; use net_traits::{IpcSend, load_whole_resource}; use net_traits::request::{CredentialsMode, Destination, RequestInit, Type as RequestType}; -use script_runtime::{CommonScriptMsg, ScriptChan, ScriptPort, StackRootTLS, new_rt_and_cx}; +use script_runtime::{CommonScriptMsg, ScriptChan, ScriptPort, new_rt_and_cx}; use script_runtime::ScriptThreadEventCategory::WorkerEvent; use script_traits::{TimerEvent, TimerSource, WorkerGlobalScopeInit, WorkerScriptLoadOrigin}; use servo_rand::random; @@ -172,7 +172,7 @@ impl DedicatedWorkerGlobalScope { } let roots = RootCollection::new(); - let _stack_roots_tls = StackRootTLS::new(&roots); + let _stack_roots = ThreadLocalStackRoots::new(&roots); let WorkerScriptLoadOrigin { referrer_url, referrer_policy, pipeline_id } = worker_load_origin; diff --git a/components/script/dom/serviceworkerglobalscope.rs b/components/script/dom/serviceworkerglobalscope.rs index 5e4ad439c90..3183598e229 100644 --- a/components/script/dom/serviceworkerglobalscope.rs +++ b/components/script/dom/serviceworkerglobalscope.rs @@ -9,7 +9,7 @@ use dom::bindings::codegen::Bindings::ServiceWorkerGlobalScopeBinding; use dom::bindings::codegen::Bindings::ServiceWorkerGlobalScopeBinding::ServiceWorkerGlobalScopeMethods; use dom::bindings::inheritance::Castable; use dom::bindings::reflector::DomObject; -use dom::bindings::root::{DomRoot, RootCollection}; +use dom::bindings::root::{DomRoot, RootCollection, ThreadLocalStackRoots}; use dom::bindings::str::DOMString; use dom::event::Event; use dom::eventtarget::EventTarget; @@ -25,7 +25,7 @@ use js::jsval::UndefinedValue; use js::rust::Runtime; use net_traits::{load_whole_resource, IpcSend, CustomResponseMediator}; use net_traits::request::{CredentialsMode, Destination, RequestInit, Type as RequestType}; -use script_runtime::{CommonScriptMsg, ScriptChan, StackRootTLS, new_rt_and_cx}; +use script_runtime::{CommonScriptMsg, ScriptChan, new_rt_and_cx}; use script_traits::{TimerEvent, WorkerGlobalScopeInit, ScopeThings, ServiceWorkerMsg, WorkerScriptLoadOrigin}; use servo_config::prefs::PREFS; use servo_rand::random; @@ -154,7 +154,7 @@ impl ServiceWorkerGlobalScope { thread::Builder::new().name(format!("ServiceWorker for {}", serialized_worker_url)).spawn(move || { thread_state::initialize(SCRIPT | IN_WORKER); let roots = RootCollection::new(); - let _stack_roots_tls = StackRootTLS::new(&roots); + let _stack_roots = ThreadLocalStackRoots::new(&roots); let WorkerScriptLoadOrigin { referrer_url, referrer_policy, pipeline_id } = worker_load_origin; diff --git a/components/script/dom/worklet.rs b/components/script/dom/worklet.rs index 4f13fac1b1a..5b822ab9d4f 100644 --- a/components/script/dom/worklet.rs +++ b/components/script/dom/worklet.rs @@ -20,7 +20,7 @@ use dom::bindings::inheritance::Castable; use dom::bindings::refcounted::TrustedPromise; use dom::bindings::reflector::Reflector; use dom::bindings::reflector::reflect_dom_object; -use dom::bindings::root::{Dom, DomRoot, RootCollection}; +use dom::bindings::root::{Dom, DomRoot, RootCollection, ThreadLocalStackRoots}; use dom::bindings::str::USVString; use dom::bindings::trace::JSTraceable; use dom::bindings::trace::RootedTraceableBox; @@ -47,7 +47,6 @@ use net_traits::request::RequestMode; use net_traits::request::Type as RequestType; use script_runtime::CommonScriptMsg; use script_runtime::ScriptThreadEventCategory; -use script_runtime::StackRootTLS; use script_runtime::new_rt_and_cx; use script_thread::{MainThreadScriptMsg, ScriptThread}; use servo_rand; @@ -429,7 +428,7 @@ impl WorkletThread { debug!("Initializing worklet thread."); thread_state::initialize(thread_state::SCRIPT | thread_state::IN_WORKER); let roots = RootCollection::new(); - let _stack_roots_tls = StackRootTLS::new(&roots); + let _stack_roots = ThreadLocalStackRoots::new(&roots); let mut thread = RootedTraceableBox::new(WorkletThread { role: role, control_receiver: control_receiver, diff --git a/components/script/script_runtime.rs b/components/script/script_runtime.rs index e437e1a6001..7985f562cbe 100644 --- a/components/script/script_runtime.rs +++ b/components/script/script_runtime.rs @@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::PromiseBinding::PromiseJobCallback; use dom::bindings::refcounted::{LiveDOMReferences, trace_refcounted_objects}; -use dom::bindings::root::{RootCollection, RootCollectionPtr, trace_roots}; +use dom::bindings::root::trace_roots; use dom::bindings::settings_stack; use dom::bindings::trace::{JSTraceable, trace_traceables}; use dom::bindings::utils::DOM_CALLBACKS; @@ -23,13 +23,12 @@ use js::panic::wrap_panic; use js::rust::Runtime; use microtask::{EnqueuedPromiseCallback, Microtask}; use profile_traits::mem::{Report, ReportKind, ReportsChan}; -use script_thread::{STACK_ROOTS, trace_thread}; +use script_thread::trace_thread; use servo_config::opts; use servo_config::prefs::PREFS; use std::cell::Cell; use std::fmt; use std::io::{Write, stdout}; -use std::marker::PhantomData; use std::os; use std::os::raw::c_void; use std::panic::AssertUnwindSafe; @@ -102,23 +101,6 @@ pub trait ScriptPort { fn recv(&self) -> Result; } -pub struct StackRootTLS<'a>(PhantomData<&'a u32>); - -impl<'a> StackRootTLS<'a> { - pub fn new(roots: &'a RootCollection) -> StackRootTLS<'a> { - STACK_ROOTS.with(|ref r| { - r.set(Some(RootCollectionPtr(roots as *const _))) - }); - StackRootTLS(PhantomData) - } -} - -impl<'a> Drop for StackRootTLS<'a> { - fn drop(&mut self) { - STACK_ROOTS.with(|ref r| r.set(None)); - } -} - /// SM callback for promise job resolution. Adds a promise callback to the current /// global's microtask queue. #[allow(unsafe_code)] diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 4b9984845e8..eb8b9b389a7 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -35,7 +35,7 @@ use dom::bindings::inheritance::Castable; use dom::bindings::num::Finite; use dom::bindings::reflector::DomObject; use dom::bindings::root::{Dom, DomRoot, MutNullableDom, RootCollection}; -use dom::bindings::root::{RootCollectionPtr, RootedReference}; +use dom::bindings::root::{RootCollectionPtr, RootedReference, ThreadLocalStackRoots}; use dom::bindings::str::DOMString; use dom::bindings::structuredclone::StructuredCloneData; use dom::bindings::trace::JSTraceable; @@ -86,7 +86,7 @@ use profile_traits::mem::{self, OpaqueSender, Report, ReportKind, ReportsChan}; use profile_traits::time::{self, ProfilerCategory, profile}; use script_layout_interface::message::{self, Msg, NewLayoutThreadInfo, ReflowQueryType}; use script_runtime::{CommonScriptMsg, ScriptChan, ScriptThreadEventCategory}; -use script_runtime::{ScriptPort, StackRootTLS, get_reports, new_rt_and_cx}; +use script_runtime::{ScriptPort, get_reports, new_rt_and_cx}; use script_traits::{CompositorEvent, ConstellationControlMsg}; use script_traits::{DiscardBrowsingContext, DocumentActivity, EventResult}; use script_traits::{InitialScriptState, JsEvalResult, LayoutMsg, LoadData}; @@ -545,7 +545,7 @@ impl ScriptThreadFactory for ScriptThread { PipelineNamespace::install(state.pipeline_namespace_id); TopLevelBrowsingContextId::install(state.top_level_browsing_context_id); let roots = RootCollection::new(); - let _stack_roots_tls = StackRootTLS::new(&roots); + let _stack_roots = ThreadLocalStackRoots::new(&roots); let id = state.id; let browsing_context_id = state.browsing_context_id; let top_level_browsing_context_id = state.top_level_browsing_context_id;