aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2023-09-26 08:54:41 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2023-09-26 13:45:03 +0400
commit0f43e90b2a85fc5549d45e6c0bc10051f238a5d8 (patch)
tree0d2ee0d9be356b5397cf3286e3a11c6b8c358a8f
parentbbf707367a29f3e830e81e638a94923132c0edaa (diff)
downloadniri-0f43e90b2a85fc5549d45e6c0bc10051f238a5d8.tar.gz
niri-0f43e90b2a85fc5549d45e6c0bc10051f238a5d8.tar.bz2
niri-0f43e90b2a85fc5549d45e6c0bc10051f238a5d8.zip
tty: Avoid panicks in the vblank callback
-rw-r--r--src/backend/tty.rs28
1 files changed, 22 insertions, 6 deletions
diff --git a/src/backend/tty.rs b/src/backend/tty.rs
index 6f728485..572e01fa 100644
--- a/src/backend/tty.rs
+++ b/src/backend/tty.rs
@@ -571,8 +571,17 @@ impl Tty {
fn on_vblank(&mut self, niri: &mut Niri, crtc: crtc::Handle, meta: &DrmEventMetadata) {
let now = get_monotonic_time();
- let device = self.output_device.as_mut().unwrap();
- let surface = device.surfaces.get_mut(&crtc).unwrap();
+ let Some(device) = self.output_device.as_mut() else {
+ // I've seen it happen.
+ error!("missing output device in vblank callback for crtc {crtc:?}");
+ return;
+ };
+
+ let Some(surface) = device.surfaces.get_mut(&crtc) else {
+ error!("missing surface in vblank callback for crtc {crtc:?}");
+ return;
+ };
+
let name = &surface.name;
trace!("vblank on {name} {meta:?}");
@@ -611,16 +620,23 @@ impl Tty {
.unwrap()
.message(&message, 0);
- let output = niri
+ let Some(output) = niri
.global_space
.outputs()
.find(|output| {
let tty_state: &TtyOutputState = output.user_data().get().unwrap();
tty_state.device_id == device.id && tty_state.crtc == crtc
})
- .unwrap()
- .clone();
- let output_state = niri.output_state.get_mut(&output).unwrap();
+ .cloned()
+ else {
+ error!("missing output in global space for {name}");
+ return;
+ };
+
+ let Some(output_state) = niri.output_state.get_mut(&output) else {
+ error!("missing output state for {name}");
+ return;
+ };
// Mark the last frame as submitted.
match surface.compositor.frame_submitted() {