aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2019-11-27 01:23:20 -0500
committerGitHub <noreply@github.com>2019-11-27 01:23:20 -0500
commitf16642210258bcf86de5e40574852002f7c08a80 (patch)
treed163365d072555ef0247c24c65918dec2a073209 /components/script
parentb62d1d4f7a70292b55547f6ea9f59e19525522ec (diff)
parent1c7f2d696c4c19238d1362497db3ca1b866cc3da (diff)
downloadservo-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.rs5
-rw-r--r--components/script/lib.rs1
-rw-r--r--components/script/script_runtime.rs32
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) {