diff options
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/init.rs | 5 | ||||
-rw-r--r-- | components/script/lib.rs | 1 | ||||
-rw-r--r-- | components/script/script_runtime.rs | 32 |
3 files changed, 32 insertions, 6 deletions
diff --git a/components/script/init.rs b/components/script/init.rs index 15428f4f3fe..30e01dda74e 100644 --- a/components/script/init.rs +++ b/components/script/init.rs @@ -4,6 +4,7 @@ use crate::dom::bindings::codegen::RegisterBindings; use crate::dom::bindings::proxyhandler; +use crate::script_runtime::JSEngineSetup; use crate::serviceworker_manager::ServiceWorkerManager; use script_traits::SWManagerSenders; @@ -56,7 +57,7 @@ pub fn init_service_workers(sw_senders: SWManagerSenders) { } #[allow(unsafe_code)] -pub fn init() { +pub fn init() -> JSEngineSetup { unsafe { proxyhandler::init(); @@ -66,4 +67,6 @@ pub fn init() { } perform_platform_specific_initialization(); + + JSEngineSetup::new() } diff --git a/components/script/lib.rs b/components/script/lib.rs index deab92ea107..79c0657b996 100644 --- a/components/script/lib.rs +++ b/components/script/lib.rs @@ -113,6 +113,7 @@ mod unpremultiplytable; mod webdriver_handlers; pub use init::{init, init_service_workers}; +pub use script_runtime::JSEngineSetup; /// A module with everything layout can use from script. /// diff --git a/components/script/script_runtime.rs b/components/script/script_runtime.rs index 20c4ae277c2..fa02e7e564e 100644 --- a/components/script/script_runtime.rs +++ b/components/script/script_runtime.rs @@ -61,9 +61,9 @@ use js::rust::wrappers::{GetPromiseIsHandled, JS_GetPromiseResult}; use js::rust::Handle; use js::rust::HandleObject as RustHandleObject; use js::rust::IntoHandle; -use js::rust::JSEngine; use js::rust::ParentRuntime; use js::rust::Runtime as RustRuntime; +use js::rust::{JSEngine, JSEngineHandle}; use malloc_size_of::MallocSizeOfOps; use msg::constellation_msg::PipelineId; use profile_traits::mem::{Report, ReportKind, ReportsChan}; @@ -79,7 +79,9 @@ use std::os::raw::c_void; use std::panic::AssertUnwindSafe; use std::ptr; use std::rc::Rc; -use std::sync::Arc; +use std::sync::Mutex; +use std::thread; +use std::time::Duration; use style::thread_state::{self, ThreadState}; use time::{now, Tm}; @@ -395,8 +397,28 @@ impl Deref for Runtime { } } +pub struct JSEngineSetup(JSEngine); + +impl JSEngineSetup { + pub fn new() -> Self { + let engine = JSEngine::init().unwrap(); + *JS_ENGINE.lock().unwrap() = Some(engine.handle()); + Self(engine) + } +} + +impl Drop for JSEngineSetup { + fn drop(&mut self) { + *JS_ENGINE.lock().unwrap() = None; + + while !self.0.can_shutdown() { + thread::sleep(Duration::from_millis(50)); + } + } +} + lazy_static! { - static ref JS_ENGINE: Arc<JSEngine> = JSEngine::init().unwrap(); + static ref JS_ENGINE: Mutex<Option<JSEngineHandle>> = Mutex::new(None); } #[allow(unsafe_code)] @@ -421,7 +443,7 @@ unsafe fn new_rt_and_cx_with_parent( let runtime = if let Some(parent) = parent { RustRuntime::create_with_parent(parent) } else { - RustRuntime::new(JS_ENGINE.clone()) + RustRuntime::new(JS_ENGINE.lock().unwrap().as_ref().unwrap().clone()) }; let cx = runtime.cx(); @@ -794,7 +816,7 @@ unsafe fn set_gc_zeal_options(cx: *mut RawJSContext) { use js::jsapi::{JS_SetGCZeal, JS_DEFAULT_ZEAL_FREQ}; let level = match pref!(js.mem.gc.zeal.level) { - level @ 0...14 => level as u8, + level @ 0..=14 => level as u8, _ => return, }; let frequency = match pref!(js.mem.gc.zeal.frequency) { |