diff options
author | Nupur Baghel <nupurbaghel@gmail.com> | 2018-02-18 23:02:48 +0530 |
---|---|---|
committer | Nupur Baghel <nupurbaghel@gmail.com> | 2018-02-22 21:34:53 +0530 |
commit | 36991b9d7963bcf72a71e3cd5c0e0823960cfe32 (patch) | |
tree | 243ee8646f82ff36ed62f9d78fe21a81c1d73e84 /components/script/dom | |
parent | d423e54d58d6cced950896eed1957ee2989f4eee (diff) | |
download | servo-36991b9d7963bcf72a71e3cd5c0e0823960cfe32.tar.gz servo-36991b9d7963bcf72a71e3cd5c0e0823960cfe32.zip |
added autoclose worker
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/globalscope.rs | 22 | ||||
-rw-r--r-- | components/script/dom/worker.rs | 1 |
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 { |