diff --git a/Cargo.lock b/Cargo.lock index bb2487cfd7d..b2b528017f4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -558,9 +558,9 @@ checksum = "28346c117b50270785fbc123bd6e4ecad20d0c6d5f43d081dc80a3abcc62be64" [[package]] name = "bytemuck" -version = "1.16.3" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "102087e286b4677862ea56cf8fc58bb2cdfa8725c40ffb80fe3a008eb7f2fc83" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" dependencies = [ "bytemuck_derive", ] @@ -6730,9 +6730,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.16" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +checksum = "4873307b7c257eddcb50c9bedf158eb669578359fb28428bef438fec8e6ba7c2" [[package]] name = "task_info" @@ -7074,9 +7074,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "f8fb9f64314842840f1d940ac544da178732128f1c78c21772e876579e0da1db" dependencies = [ "serde", ] diff --git a/components/canvas/webgl_thread.rs b/components/canvas/webgl_thread.rs index f0dd3da3705..1ab3ce95bb3 100644 --- a/components/canvas/webgl_thread.rs +++ b/components/canvas/webgl_thread.rs @@ -368,7 +368,10 @@ impl WebGLThread { WebGLMsg::SwapBuffers(swap_ids, sender, sent_time) => { self.handle_swap_buffers(swap_ids, sender, sent_time); }, - WebGLMsg::Exit => { + WebGLMsg::Exit(sender) => { + if let Err(e) = sender.send(()) { + warn!("Failed to send response to WebGLMsg::Exit ({e})"); + } return true; }, } diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs index 381a5ae7503..ef0676f643f 100644 --- a/components/constellation/constellation.rs +++ b/components/constellation/constellation.rs @@ -2644,6 +2644,7 @@ where ipc::channel().expect("Failed to create IPC channel!"); let (storage_ipc_sender, storage_ipc_receiver) = ipc::channel().expect("Failed to create IPC channel!"); + let mut webgl_threads_receiver = None; debug!("Exiting core resource threads."); if let Err(e) = self @@ -2710,9 +2711,12 @@ where } if let Some(webgl_threads) = self.webgl_threads.as_ref() { + let (sender, receiver) = ipc::channel().expect("Failed to create IPC channel!"); + webgl_threads_receiver = Some(receiver); debug!("Exiting WebGL thread."); - if let Err(e) = webgl_threads.exit() { - warn!("Exit WebGL Thread failed ({})", e); + + if let Err(e) = webgl_threads.exit(sender) { + warn!("Exit WebGL Thread failed ({e})"); } } @@ -2733,6 +2737,14 @@ where if let Err(e) = storage_ipc_receiver.recv() { warn!("Exit storage thread failed ({:?})", e); } + if self.webgl_threads.is_some() { + if let Err(e) = webgl_threads_receiver + .expect("webgl_threads_receiver to be Some") + .recv() + { + warn!("Exit WebGL thread failed ({:?})", e); + } + } debug!("Asking compositor to complete shutdown."); self.compositor_proxy.send(CompositorMsg::ShutdownComplete); diff --git a/components/shared/canvas/webgl.rs b/components/shared/canvas/webgl.rs index 0e22ee01b59..c42e5dc6e61 100644 --- a/components/shared/canvas/webgl.rs +++ b/components/shared/canvas/webgl.rs @@ -14,7 +14,7 @@ pub use base::generic_channel::GenericSender as WebGLSender; /// Result type for send()/recv() calls in in WebGLCommands. pub use base::generic_channel::SendResult as WebGLSendResult; use euclid::default::{Rect, Size2D}; -use ipc_channel::ipc::{IpcBytesReceiver, IpcBytesSender, IpcSharedMemory}; +use ipc_channel::ipc::{IpcBytesReceiver, IpcBytesSender, IpcSender, IpcSharedMemory}; use malloc_size_of_derive::MallocSizeOf; use pixels::PixelFormat; use serde::{Deserialize, Serialize}; @@ -73,9 +73,9 @@ impl WebGLThreads { } /// Sends a exit message to close the WebGLThreads and release all WebGLContexts. - pub fn exit(&self) -> Result<(), &'static str> { + pub fn exit(&self, sender: IpcSender<()>) -> Result<(), &'static str> { self.0 - .send(WebGLMsg::Exit) + .send(WebGLMsg::Exit(sender)) .map_err(|_| "Failed to send Exit message") } } @@ -106,7 +106,7 @@ pub enum WebGLMsg { /// request is fulfilled SwapBuffers(Vec, WebGLSender, u64), /// Frees all resources and closes the thread. - Exit, + Exit(IpcSender<()>), } #[derive(Clone, Copy, Debug, Deserialize, MallocSizeOf, PartialEq, Serialize)]