diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2023-09-26 08:54:41 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2023-09-26 13:45:03 +0400 |
| commit | 0f43e90b2a85fc5549d45e6c0bc10051f238a5d8 (patch) | |
| tree | 0d2ee0d9be356b5397cf3286e3a11c6b8c358a8f /src/backend | |
| parent | bbf707367a29f3e830e81e638a94923132c0edaa (diff) | |
| download | niri-0f43e90b2a85fc5549d45e6c0bc10051f238a5d8.tar.gz niri-0f43e90b2a85fc5549d45e6c0bc10051f238a5d8.tar.bz2 niri-0f43e90b2a85fc5549d45e6c0bc10051f238a5d8.zip | |
tty: Avoid panicks in the vblank callback
Diffstat (limited to 'src/backend')
| -rw-r--r-- | src/backend/tty.rs | 28 |
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() { |
