From 558a55c0b2c300df86baf6829c7086f1385502cb Mon Sep 17 00:00:00 2001 From: Gregory Terzian Date: Wed, 17 Jun 2020 22:49:19 +0800 Subject: [PATCH] do not trace pending parsers --- components/script/dom/bindings/trace.rs | 3 +++ components/script/dom/servoparser/mod.rs | 1 - components/script/script_thread.rs | 14 ++++++++------ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index 9518a2c0989..f1354cb218b 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -42,6 +42,7 @@ use crate::dom::htmlimageelement::SourceSet; use crate::dom::htmlmediaelement::{HTMLMediaElementFetchContext, MediaFrameRenderer}; use crate::dom::identityhub::Identities; use crate::script_runtime::StreamConsumer; +use crate::script_thread::IncompleteParserContexts; use crate::task::TaskBox; use app_units::Au; use canvas_traits::canvas::{ @@ -183,6 +184,8 @@ pub unsafe trait JSTraceable { unsafe_no_jsmanaged_fields!(Box, Box); +unsafe_no_jsmanaged_fields!(IncompleteParserContexts); + unsafe_no_jsmanaged_fields!(MessagePortImpl); unsafe_no_jsmanaged_fields!(MessagePortId); unsafe_no_jsmanaged_fields!(MessagePortRouterId); diff --git a/components/script/dom/servoparser/mod.rs b/components/script/dom/servoparser/mod.rs index 3949f70c53e..099f6ef809c 100644 --- a/components/script/dom/servoparser/mod.rs +++ b/components/script/dom/servoparser/mod.rs @@ -689,7 +689,6 @@ impl Tokenizer { /// The context required for asynchronously fetching a document /// and parsing it progressively. -#[derive(JSTraceable)] pub struct ParserContext { /// The parser that initiated the request. parser: Option>, diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 729fe1595bc..5b80324d713 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -500,7 +500,7 @@ impl<'a> Iterator for DocumentsIter<'a> { // which can trigger GC, and so we can end up tracing the script // thread during parsing. For this reason, we don't trace the // incomplete parser contexts during GC. -type IncompleteParserContexts = Vec<(PipelineId, ParserContext)>; +pub struct IncompleteParserContexts(RefCell>); unsafe_no_jsmanaged_fields!(TaskQueue); unsafe_no_jsmanaged_fields!(dyn BackgroundHangMonitorRegister); @@ -518,7 +518,7 @@ pub struct ScriptThread { /// A list of data pertaining to loads that have not yet received a network response incomplete_loads: DomRefCell>, /// A vector containing parser contexts which have not yet been fully processed - incomplete_parser_contexts: RefCell, + incomplete_parser_contexts: IncompleteParserContexts, /// Image cache for this script thread. image_cache: Arc, /// A handle to the resource thread. This is an `Arc` to avoid running out of file descriptors if @@ -1257,7 +1257,7 @@ impl ScriptThread { documents: DomRefCell::new(Documents::new()), window_proxies: DomRefCell::new(HashMap::new()), incomplete_loads: DomRefCell::new(vec![]), - incomplete_parser_contexts: RefCell::new(vec![]), + incomplete_parser_contexts: IncompleteParserContexts(RefCell::new(vec![])), image_cache: state.image_cache.clone(), image_cache_channel: image_cache_channel, @@ -3686,6 +3686,7 @@ impl ScriptThread { let context = ParserContext::new(id, load_data.url); self.incomplete_parser_contexts + .0 .borrow_mut() .push((id, context)); @@ -3712,7 +3713,7 @@ impl ScriptThread { }, }; - let mut incomplete_parser_contexts = self.incomplete_parser_contexts.borrow_mut(); + let mut incomplete_parser_contexts = self.incomplete_parser_contexts.0.borrow_mut(); let parser = incomplete_parser_contexts .iter_mut() .find(|&&mut (pipeline_id, _)| pipeline_id == id); @@ -3722,7 +3723,7 @@ impl ScriptThread { } fn handle_fetch_chunk(&self, id: PipelineId, chunk: Vec) { - let mut incomplete_parser_contexts = self.incomplete_parser_contexts.borrow_mut(); + let mut incomplete_parser_contexts = self.incomplete_parser_contexts.0.borrow_mut(); let parser = incomplete_parser_contexts .iter_mut() .find(|&&mut (pipeline_id, _)| pipeline_id == id); @@ -3734,12 +3735,13 @@ impl ScriptThread { fn handle_fetch_eof(&self, id: PipelineId, eof: Result) { let idx = self .incomplete_parser_contexts + .0 .borrow() .iter() .position(|&(pipeline_id, _)| pipeline_id == id); if let Some(idx) = idx { - let (_, mut ctxt) = self.incomplete_parser_contexts.borrow_mut().remove(idx); + let (_, mut ctxt) = self.incomplete_parser_contexts.0.borrow_mut().remove(idx); ctxt.process_response_eof(eof); } }