mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
Fix panic in Webrender during shutdown (#32897)
* Fix panic in webrender during shutdown Signed-off-by: Bentaimia Haddadi <haddadi.taym@gmail.com> * Pass webgl_threads_sender to WebGLThreads::exit Signed-off-by: Bentaimia Haddadi <haddadi.taym@gmail.com> * follow the naming convention and use sender instead of webgl_threads_sender Signed-off-by: Bentaimia Haddadi <haddadi.taym@gmail.com> * Avoid deadlock when webgl_threads is None Signed-off-by: Bentaimia Haddadi <haddadi.taym@gmail.com> * Use tuple matching for webgl_threads and webgl_threads_receiver Signed-off-by: Bentaimia Haddadi <haddadi.taym@gmail.com> * Remove unused _webgl_threads_sender Signed-off-by: Bentaimia Haddadi <haddadi.taym@gmail.com> --------- Signed-off-by: Bentaimia Haddadi <haddadi.taym@gmail.com>
This commit is contained in:
parent
28430bad0e
commit
3800922cde
4 changed files with 28 additions and 13 deletions
12
Cargo.lock
generated
12
Cargo.lock
generated
|
@ -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",
|
||||
]
|
||||
|
|
|
@ -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;
|
||||
},
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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<WebGLContextId>, WebGLSender<u64>, u64),
|
||||
/// Frees all resources and closes the thread.
|
||||
Exit,
|
||||
Exit(IpcSender<()>),
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, Deserialize, MallocSizeOf, PartialEq, Serialize)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue