From 8482d2e781fc948d0d33b0366005264c4f99ccdd Mon Sep 17 00:00:00 2001 From: Gregory Terzian Date: Fri, 9 Aug 2019 15:52:49 +0800 Subject: [PATCH] restructure content process shutdown ack with threaded sender, without layout --- components/constellation/pipeline.rs | 27 +++++-------------- components/layout_thread/lib.rs | 5 ---- components/layout_thread_2020/lib.rs | 5 ---- components/layout_traits/lib.rs | 1 - components/script/dom/htmliframeelement.rs | 1 - components/script/dom/windowproxy.rs | 1 - components/script/script_thread.rs | 4 +-- components/script_layout_interface/message.rs | 1 - components/script_traits/lib.rs | 4 +-- 9 files changed, 9 insertions(+), 40 deletions(-) diff --git a/components/constellation/pipeline.rs b/components/constellation/pipeline.rs index 43c6a13524f1..5182110f3a50 100644 --- a/components/constellation/pipeline.rs +++ b/components/constellation/pipeline.rs @@ -9,7 +9,7 @@ use canvas_traits::webgl::WebGLPipeline; use compositing::compositor_thread::Msg as CompositorMsg; use compositing::CompositionPipeline; use compositing::CompositorProxy; -use crossbeam_channel::Sender; +use crossbeam_channel::{unbounded, Sender}; use devtools_traits::{DevtoolsControlMsg, ScriptToDevtoolsControlMsg}; use embedder_traits::EventLoopWaker; use euclid::{Scale, Size2D}; @@ -218,9 +218,6 @@ impl Pipeline { // probably requires a general low-memory strategy. let (pipeline_chan, pipeline_port) = ipc::channel().expect("Pipeline main chan"); - let (layout_content_process_shutdown_chan, layout_content_process_shutdown_port) = - ipc::channel().expect("Pipeline layout content shutdown chan"); - let window_size = WindowSizeData { initial_viewport: state.window_size, device_pixel_ratio: state.device_pixel_ratio, @@ -237,7 +234,6 @@ impl Pipeline { load_data: state.load_data.clone(), window_size: window_size, pipeline_port: pipeline_port, - content_process_shutdown_chan: Some(layout_content_process_shutdown_chan), }; if let Err(e) = @@ -275,9 +271,6 @@ impl Pipeline { script_to_devtools_chan }); - let (script_content_process_shutdown_chan, script_content_process_shutdown_port) = - ipc::channel().expect("Pipeline script content process shutdown chan"); - let mut unprivileged_pipeline_content = UnprivilegedPipelineContent { id: state.id, browsing_context_id: state.browsing_context_id, @@ -306,10 +299,6 @@ impl Pipeline { prefs: prefs::pref_map().iter().collect(), pipeline_port: pipeline_port, pipeline_namespace_id: state.pipeline_namespace_id, - layout_content_process_shutdown_chan: layout_content_process_shutdown_chan, - layout_content_process_shutdown_port: layout_content_process_shutdown_port, - script_content_process_shutdown_chan: script_content_process_shutdown_chan, - script_content_process_shutdown_port: script_content_process_shutdown_port, webrender_api_sender: state.webrender_api_sender, webrender_document: state.webrender_document, webgl_chan: state.webgl_chan, @@ -515,10 +504,6 @@ pub struct UnprivilegedPipelineContent { prefs: HashMap, pipeline_port: IpcReceiver, pipeline_namespace_id: PipelineNamespaceId, - layout_content_process_shutdown_chan: IpcSender<()>, - layout_content_process_shutdown_port: IpcReceiver<()>, - script_content_process_shutdown_chan: IpcSender<()>, - script_content_process_shutdown_port: IpcReceiver<()>, webrender_api_sender: webrender_api::RenderApiSender, webrender_document: webrender_api::DocumentId, webgl_chan: Option, @@ -545,6 +530,7 @@ impl UnprivilegedPipelineContent { self.script_chan.clone(), self.load_data.url.clone(), ); + let (content_process_shutdown_chan, content_process_shutdown_port) = unbounded(); let layout_thread_busy_flag = Arc::new(AtomicBool::new(false)); let layout_pair = STF::create( InitialScriptState { @@ -567,7 +553,7 @@ impl UnprivilegedPipelineContent { devtools_chan: self.devtools_chan, window_size: self.window_size, pipeline_namespace_id: self.pipeline_namespace_id, - content_process_shutdown_chan: self.script_content_process_shutdown_chan, + content_process_shutdown_chan: content_process_shutdown_chan, webgl_chan: self.webgl_chan, webvr_chan: self.webvr_chan, webxr_registry: self.webxr_registry, @@ -605,7 +591,6 @@ impl UnprivilegedPipelineContent { self.font_cache_thread, self.time_profiler_chan, self.mem_profiler_chan, - Some(self.layout_content_process_shutdown_chan), self.webrender_api_sender, self.webrender_document, paint_time_metrics, @@ -624,8 +609,10 @@ impl UnprivilegedPipelineContent { ); if wait_for_completion { - let _ = self.script_content_process_shutdown_port.recv(); - let _ = self.layout_content_process_shutdown_port.recv(); + match content_process_shutdown_port.recv() { + Ok(()) => {}, + Err(_) => error!("Script-thread shut-down unexpectedly"), + } } } diff --git a/components/layout_thread/lib.rs b/components/layout_thread/lib.rs index 2febabce08b1..887c31f46574 100644 --- a/components/layout_thread/lib.rs +++ b/components/layout_thread/lib.rs @@ -306,7 +306,6 @@ impl LayoutThreadFactory for LayoutThread { font_cache_thread: FontCacheThread, time_profiler_chan: profile_time::ProfilerChan, mem_profiler_chan: profile_mem::ProfilerChan, - content_process_shutdown_chan: Option>, webrender_api_sender: webrender_api::RenderApiSender, webrender_document: webrender_api::DocumentId, paint_time_metrics: PaintTimeMetrics, @@ -383,9 +382,6 @@ impl LayoutThreadFactory for LayoutThread { Msg::CollectReports, ); } - if let Some(content_process_shutdown_chan) = content_process_shutdown_chan { - let _ = content_process_shutdown_chan.send(()); - } }) .expect("Thread spawning failed"); } @@ -951,7 +947,6 @@ impl LayoutThread { self.font_cache_thread.clone(), self.time_profiler_chan.clone(), self.mem_profiler_chan.clone(), - info.content_process_shutdown_chan, self.webrender_api.clone_sender(), self.webrender_document, info.paint_time_metrics, diff --git a/components/layout_thread_2020/lib.rs b/components/layout_thread_2020/lib.rs index 3f6c2e6f8d5b..82919fa75c19 100644 --- a/components/layout_thread_2020/lib.rs +++ b/components/layout_thread_2020/lib.rs @@ -243,7 +243,6 @@ impl LayoutThreadFactory for LayoutThread { font_cache_thread: FontCacheThread, time_profiler_chan: profile_time::ProfilerChan, mem_profiler_chan: profile_mem::ProfilerChan, - content_process_shutdown_chan: Option>, webrender_api_sender: webrender_api::RenderApiSender, webrender_document: webrender_api::DocumentId, paint_time_metrics: PaintTimeMetrics, @@ -312,9 +311,6 @@ impl LayoutThreadFactory for LayoutThread { Msg::CollectReports, ); } - if let Some(content_process_shutdown_chan) = content_process_shutdown_chan { - let _ = content_process_shutdown_chan.send(()); - } }) .expect("Thread spawning failed"); } @@ -819,7 +815,6 @@ impl LayoutThread { self.font_cache_thread.clone(), self.time_profiler_chan.clone(), self.mem_profiler_chan.clone(), - info.content_process_shutdown_chan, self.webrender_api.clone_sender(), self.webrender_document, info.paint_time_metrics, diff --git a/components/layout_traits/lib.rs b/components/layout_traits/lib.rs index a37e89431253..cfb824f6c989 100644 --- a/components/layout_traits/lib.rs +++ b/components/layout_traits/lib.rs @@ -43,7 +43,6 @@ pub trait LayoutThreadFactory { font_cache_thread: FontCacheThread, time_profiler_chan: time::ProfilerChan, mem_profiler_chan: mem::ProfilerChan, - content_process_shutdown_chan: Option>, webrender_api_sender: webrender_api::RenderApiSender, webrender_document: webrender_api::DocumentId, paint_time_metrics: PaintTimeMetrics, diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs index fbeaf14cdf48..a3a246c4edc6 100644 --- a/components/script/dom/htmliframeelement.rs +++ b/components/script/dom/htmliframeelement.rs @@ -198,7 +198,6 @@ impl HTMLIFrameElement { opener: None, load_data: load_data, pipeline_port: pipeline_receiver, - content_process_shutdown_chan: None, window_size: WindowSizeData { initial_viewport: { let rect = self.upcast::().bounding_content_box_or_zero(); diff --git a/components/script/dom/windowproxy.rs b/components/script/dom/windowproxy.rs index 79b93792ce5b..d64975a78b99 100644 --- a/components/script/dom/windowproxy.rs +++ b/components/script/dom/windowproxy.rs @@ -303,7 +303,6 @@ impl WindowProxy { opener: Some(self.browsing_context_id), load_data: load_data, pipeline_port: pipeline_receiver, - content_process_shutdown_chan: None, window_size: window.window_size(), }; let constellation_msg = ScriptMsg::ScriptNewAuxiliary(load_info, pipeline_sender); diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index f545689041cf..8347113791ec 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -612,7 +612,7 @@ pub struct ScriptThread { timer_event_chan: Sender, timer_event_port: Receiver, - content_process_shutdown_chan: IpcSender<()>, + content_process_shutdown_chan: Sender<()>, /// microtask_queue: Rc, @@ -2276,7 +2276,6 @@ impl ScriptThread { load_data, window_size, pipeline_port, - content_process_shutdown_chan, } = new_layout_info; let layout_pair = unbounded(); @@ -2294,7 +2293,6 @@ impl ScriptThread { constellation_chan: self.layout_to_constellation_chan.clone(), script_chan: self.control_chan.clone(), image_cache: self.image_cache.clone(), - content_process_shutdown_chan: content_process_shutdown_chan, paint_time_metrics: PaintTimeMetrics::new( new_pipeline_id, self.time_profiler_chan.clone(), diff --git a/components/script_layout_interface/message.rs b/components/script_layout_interface/message.rs index c6d9710541f7..01a589d53cbe 100644 --- a/components/script_layout_interface/message.rs +++ b/components/script_layout_interface/message.rs @@ -225,7 +225,6 @@ pub struct LayoutThreadInit { pub constellation_chan: IpcSender, pub script_chan: IpcSender, pub image_cache: Arc, - pub content_process_shutdown_chan: Option>, pub paint_time_metrics: PaintTimeMetrics, pub layout_is_busy: Arc, } diff --git a/components/script_traits/lib.rs b/components/script_traits/lib.rs index 6a293c68ed0f..00fb64b39e9e 100644 --- a/components/script_traits/lib.rs +++ b/components/script_traits/lib.rs @@ -219,8 +219,6 @@ pub struct NewLayoutInfo { pub window_size: WindowSizeData, /// A port on which layout can receive messages from the pipeline. pub pipeline_port: IpcReceiver, - /// A shutdown channel so that layout can tell the content process to shut down when it's done. - pub content_process_shutdown_chan: Option>, } /// When a pipeline is closed, should its browsing context be discarded too? @@ -651,7 +649,7 @@ pub struct InitialScriptState { /// The ID of the pipeline namespace for this script thread. pub pipeline_namespace_id: PipelineNamespaceId, /// A ping will be sent on this channel once the script thread shuts down. - pub content_process_shutdown_chan: IpcSender<()>, + pub content_process_shutdown_chan: Sender<()>, /// A channel to the WebGL thread used in this pipeline. pub webgl_chan: Option, /// A channel to the webvr thread, if available.