aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorNupur Baghel <nupurbaghel@gmail.com>2018-02-18 23:02:48 +0530
committerNupur Baghel <nupurbaghel@gmail.com>2018-02-22 21:34:53 +0530
commit36991b9d7963bcf72a71e3cd5c0e0823960cfe32 (patch)
tree243ee8646f82ff36ed62f9d78fe21a81c1d73e84 /components/script/dom
parentd423e54d58d6cced950896eed1957ee2989f4eee (diff)
downloadservo-36991b9d7963bcf72a71e3cd5c0e0823960cfe32.tar.gz
servo-36991b9d7963bcf72a71e3cd5c0e0823960cfe32.zip
added autoclose worker
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/globalscope.rs22
-rw-r--r--components/script/dom/worker.rs1
2 files changed, 23 insertions, 0 deletions
diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs
index 255f2c34839..e3a1db7a1a7 100644
--- a/components/script/dom/globalscope.rs
+++ b/components/script/dom/globalscope.rs
@@ -47,6 +47,8 @@ use std::collections::HashMap;
use std::collections::hash_map::Entry;
use std::ffi::CString;
use std::rc::Rc;
+use std::sync::Arc;
+use std::sync::atomic::{AtomicBool, Ordering};
use task::TaskCanceller;
use task_source::file_reading::FileReadingTaskSource;
use task_source::networking::NetworkingTaskSource;
@@ -55,6 +57,17 @@ use time::{Timespec, get_time};
use timers::{IsInterval, OneshotTimerCallback, OneshotTimerHandle};
use timers::{OneshotTimers, TimerCallback};
+#[derive(JSTraceable)]
+pub struct AutoCloseWorker(
+ Arc<AtomicBool>,
+);
+
+impl Drop for AutoCloseWorker {
+ fn drop(&mut self) {
+ self.0.store(true, Ordering::SeqCst);
+ }
+}
+
#[dom_struct]
pub struct GlobalScope {
eventtarget: EventTarget,
@@ -110,6 +123,10 @@ pub struct GlobalScope {
/// <https://html.spec.whatwg.org/multipage/#microtask-queue>
#[ignore_malloc_size_of = "Rc<T> is hard"]
microtask_queue: Rc<MicrotaskQueue>,
+
+ /// Vector storing closing references of all workers
+ #[ignore_malloc_size_of = "Arc"]
+ list_auto_close_worker: DomRefCell<Vec<AutoCloseWorker>>,
}
impl GlobalScope {
@@ -142,9 +159,14 @@ impl GlobalScope {
timers: OneshotTimers::new(timer_event_chan, scheduler_chan),
origin,
microtask_queue,
+ list_auto_close_worker: Default::default(),
}
}
+ pub fn track_worker(&self, closing_worker: Arc<AtomicBool>) {
+ self.list_auto_close_worker.borrow_mut().push(AutoCloseWorker(closing_worker));
+ }
+
/// Returns the global scope of the realm that the given DOM object's reflector
/// was created in.
#[allow(unsafe_code)]
diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs
index f397ef42148..1b044d62e76 100644
--- a/components/script/dom/worker.rs
+++ b/components/script/dom/worker.rs
@@ -79,6 +79,7 @@ impl Worker {
let (sender, receiver) = channel();
let closing = Arc::new(AtomicBool::new(false));
let worker = Worker::new(global, sender.clone(), closing.clone());
+ global.track_worker(closing.clone());
let worker_ref = Trusted::new(&*worker);
let worker_load_origin = WorkerScriptLoadOrigin {