From 0f43e90b2a85fc5549d45e6c0bc10051f238a5d8 Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Tue, 26 Sep 2023 08:54:41 +0400 Subject: tty: Avoid panicks in the vblank callback --- src/backend/tty.rs | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) (limited to 'src') 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() { -- cgit