From dbddf3e7fd12bbed9a53032b340412ba4af78eea Mon Sep 17 00:00:00 2001 From: Andy Gayton Date: Tue, 2 Jul 2024 20:33:12 -0400 Subject: [PATCH] update ctrlc Handlers to use Sequence --- crates/nu-plugin-engine/src/persistent.rs | 14 +++++----- crates/nu-plugin/src/plugin/interface/mod.rs | 5 +++- crates/nu-protocol/src/engine/ctrlc.rs | 28 +++++++++----------- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/crates/nu-plugin-engine/src/persistent.rs b/crates/nu-plugin-engine/src/persistent.rs index 93dd3abdf5..bd5fc77a8c 100644 --- a/crates/nu-plugin-engine/src/persistent.rs +++ b/crates/nu-plugin-engine/src/persistent.rs @@ -217,12 +217,14 @@ impl PersistentPlugin { return self.spawn(envs, mutable, ctrlc_handlers); } - let guard = ctrlc_handlers.map(|ctrlc_handlers| { - let interface = interface.clone(); - ctrlc_handlers.register(Box::new(move || { - let _ = interface.ctrlc(); - })) - }); + let guard = ctrlc_handlers + .map(|ctrlc_handlers| { + let interface = interface.clone(); + ctrlc_handlers.register(Box::new(move || { + let _ = interface.ctrlc(); + })) + }) + .transpose()?; mutable.running = Some(RunningPlugin { interface, diff --git a/crates/nu-plugin/src/plugin/interface/mod.rs b/crates/nu-plugin/src/plugin/interface/mod.rs index 97ae22e192..a18653273e 100644 --- a/crates/nu-plugin/src/plugin/interface/mod.rs +++ b/crates/nu-plugin/src/plugin/interface/mod.rs @@ -517,7 +517,10 @@ impl EngineInterface { /// Register a closure which will be called when the engine receives a Ctrl-C signal. Returns a /// RAII guard that will keep the closure alive until it is dropped. - pub fn register_ctrlc_handler(&self, handler: ctrlc::Handler) -> ctrlc::Guard { + pub fn register_ctrlc_handler( + &self, + handler: ctrlc::Handler, + ) -> Result { self.state.ctrlc_handlers.register(handler) } diff --git a/crates/nu-protocol/src/engine/ctrlc.rs b/crates/nu-protocol/src/engine/ctrlc.rs index 37a0905b90..876861a495 100644 --- a/crates/nu-protocol/src/engine/ctrlc.rs +++ b/crates/nu-protocol/src/engine/ctrlc.rs @@ -1,22 +1,20 @@ use std::fmt::Debug; -use std::sync::{ - atomic::{AtomicU64, Ordering}, - Arc, Mutex, -}; +use std::sync::{Arc, Mutex}; + +use crate::{engine::Sequence, ShellError}; pub type Handler = Box; #[derive(Clone)] pub struct Handlers { - handlers: Arc>>, - // we use an u64 so an overflow is impractical - next_id: Arc, + handlers: Arc>>, + next_id: Arc, } #[derive(Clone)] pub struct Guard { - id: u64, - handlers: Arc>>, + id: usize, + handlers: Arc>>, } impl Drop for Guard { @@ -36,19 +34,19 @@ impl Debug for Guard { impl Handlers { pub fn new() -> Handlers { let handlers = Arc::new(Mutex::new(vec![])); - let next_id = Arc::new(AtomicU64::new(0)); + let next_id = Arc::new(Sequence::default()); Handlers { handlers, next_id } } - pub fn register(&self, handler: Handler) -> Guard { - let id = self.next_id.fetch_add(1, Ordering::Relaxed); + pub fn register(&self, handler: Handler) -> Result { + let id = self.next_id.next()?; if let Ok(mut handlers) = self.handlers.lock() { handlers.push((id, handler)); } - Guard { + Ok(Guard { id, handlers: Arc::clone(&self.handlers), - } + }) } pub fn run(&self) { @@ -69,7 +67,7 @@ impl Default for Handlers { #[cfg(test)] mod tests { use super::*; - use std::sync::atomic::AtomicBool; + use std::sync::atomic::{AtomicBool, Ordering}; #[test] fn test_multiple_handlers() {