From cb4be2c707dcfbf06ea7d08fa603e2257e2f669f Mon Sep 17 00:00:00 2001 From: Jonas Maier <> Date: Wed, 11 Mar 2026 16:44:03 +0100 Subject: cancelable builtins --- src/ctrlc.rs | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'src/ctrlc.rs') diff --git a/src/ctrlc.rs b/src/ctrlc.rs index 4c0153a..9bf53fa 100644 --- a/src/ctrlc.rs +++ b/src/ctrlc.rs @@ -1,7 +1,7 @@ use crate::Session; use libc::c_int; use nix::sys::signal::*; -use std::sync::*; +use std::{sync::*, time::Instant}; static SESSION: Mutex>>> = Mutex::new(None); @@ -9,7 +9,7 @@ fn handle() { let Ok(mut se) = SESSION.lock() else { return }; let Some(se) = se.as_mut() else { return }; let Ok(mut se) = se.lock() else { return }; - se.ctrlc.pressed = true; + se.ctrlc.last_press = Instant::now(); } extern "C" fn c_handle(_signal: c_int) { @@ -21,9 +21,16 @@ extern "C" fn c_handle(_signal: c_int) { }); } -#[derive(Default)] pub struct CtrlC { - pressed: bool, + last_press: Instant, +} + +impl Default for CtrlC { + fn default() -> Self { + Self { + last_press: Instant::now(), + } + } } struct Teardown; @@ -52,12 +59,6 @@ pub fn setup(session: Arc>) -> impl Drop { Teardown } -pub fn peek(session: &Session) -> bool { - session.ctrlc.pressed -} - -pub fn pop(session: &mut Session) -> bool { - let x = session.ctrlc.pressed; - session.ctrlc.pressed = false; - x +pub fn pressed_since(session: &Session, instant: Instant) -> bool { + session.ctrlc.last_press > instant } -- cgit v1.2.3