diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2019-11-27 01:23:20 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-11-27 01:23:20 -0500 |
commit | f16642210258bcf86de5e40574852002f7c08a80 (patch) | |
tree | d163365d072555ef0247c24c65918dec2a073209 /components/script | |
parent | b62d1d4f7a70292b55547f6ea9f59e19525522ec (diff) | |
parent | 1c7f2d696c4c19238d1362497db3ca1b866cc3da (diff) | |
download | servo-f16642210258bcf86de5e40574852002f7c08a80.tar.gz servo-f16642210258bcf86de5e40574852002f7c08a80.zip |
Auto merge of #24862 - jdm:js-init-destroy-fit-the-second, r=asajeffrey
Ensure SpiderMonkey shuts down cleanly
This is the alternate solution that I described in #24845. Given how much simpler the resulting code is, I'm now much more in favour of this design. Depends on https://github.com/servo/rust-mozjs/pull/487.
---
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [x] These changes fix #21696 and fix #22276
- [x] There are tests for these changes
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) { |