Skip to content

Commit 9381229

Browse files
Taym95Gae24
authored andcommitted
Fix panic in Webrender during shutdown (servo#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>
1 parent a0cf397 commit 9381229

File tree

4 files changed

+28
-13
lines changed

4 files changed

+28
-13
lines changed

Cargo.lock

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/canvas/webgl_thread.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,10 @@ impl WebGLThread {
368368
WebGLMsg::SwapBuffers(swap_ids, sender, sent_time) => {
369369
self.handle_swap_buffers(swap_ids, sender, sent_time);
370370
},
371-
WebGLMsg::Exit => {
371+
WebGLMsg::Exit(sender) => {
372+
if let Err(e) = sender.send(()) {
373+
warn!("Failed to send response to WebGLMsg::Exit ({e})");
374+
}
372375
return true;
373376
},
374377
}

components/constellation/constellation.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2644,6 +2644,7 @@ where
26442644
ipc::channel().expect("Failed to create IPC channel!");
26452645
let (storage_ipc_sender, storage_ipc_receiver) =
26462646
ipc::channel().expect("Failed to create IPC channel!");
2647+
let mut webgl_threads_receiver = None;
26472648

26482649
debug!("Exiting core resource threads.");
26492650
if let Err(e) = self
@@ -2710,9 +2711,12 @@ where
27102711
}
27112712

27122713
if let Some(webgl_threads) = self.webgl_threads.as_ref() {
2714+
let (sender, receiver) = ipc::channel().expect("Failed to create IPC channel!");
2715+
webgl_threads_receiver = Some(receiver);
27132716
debug!("Exiting WebGL thread.");
2714-
if let Err(e) = webgl_threads.exit() {
2715-
warn!("Exit WebGL Thread failed ({})", e);
2717+
2718+
if let Err(e) = webgl_threads.exit(sender) {
2719+
warn!("Exit WebGL Thread failed ({e})");
27162720
}
27172721
}
27182722

@@ -2733,6 +2737,14 @@ where
27332737
if let Err(e) = storage_ipc_receiver.recv() {
27342738
warn!("Exit storage thread failed ({:?})", e);
27352739
}
2740+
if self.webgl_threads.is_some() {
2741+
if let Err(e) = webgl_threads_receiver
2742+
.expect("webgl_threads_receiver to be Some")
2743+
.recv()
2744+
{
2745+
warn!("Exit WebGL thread failed ({:?})", e);
2746+
}
2747+
}
27362748

27372749
debug!("Asking compositor to complete shutdown.");
27382750
self.compositor_proxy.send(CompositorMsg::ShutdownComplete);

components/shared/canvas/webgl.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pub use base::generic_channel::GenericSender as WebGLSender;
1414
/// Result type for send()/recv() calls in in WebGLCommands.
1515
pub use base::generic_channel::SendResult as WebGLSendResult;
1616
use euclid::default::{Rect, Size2D};
17-
use ipc_channel::ipc::{IpcBytesReceiver, IpcBytesSender, IpcSharedMemory};
17+
use ipc_channel::ipc::{IpcBytesReceiver, IpcBytesSender, IpcSender, IpcSharedMemory};
1818
use malloc_size_of_derive::MallocSizeOf;
1919
use pixels::PixelFormat;
2020
use serde::{Deserialize, Serialize};
@@ -73,9 +73,9 @@ impl WebGLThreads {
7373
}
7474

7575
/// Sends a exit message to close the WebGLThreads and release all WebGLContexts.
76-
pub fn exit(&self) -> Result<(), &'static str> {
76+
pub fn exit(&self, sender: IpcSender<()>) -> Result<(), &'static str> {
7777
self.0
78-
.send(WebGLMsg::Exit)
78+
.send(WebGLMsg::Exit(sender))
7979
.map_err(|_| "Failed to send Exit message")
8080
}
8181
}
@@ -106,7 +106,7 @@ pub enum WebGLMsg {
106106
/// request is fulfilled
107107
SwapBuffers(Vec<WebGLContextId>, WebGLSender<u64>, u64),
108108
/// Frees all resources and closes the thread.
109-
Exit,
109+
Exit(IpcSender<()>),
110110
}
111111

112112
#[derive(Clone, Copy, Debug, Deserialize, MallocSizeOf, PartialEq, Serialize)]

0 commit comments

Comments
 (0)