mirror signals on EngineInterface

This commit is contained in:
Andy Gayton 2024-07-23 16:57:53 -04:00
parent c48b26be50
commit ba52debb5d
3 changed files with 16 additions and 2 deletions

View File

@ -18,7 +18,7 @@ use nu_protocol::{
use nu_utils::SharedCow; use nu_utils::SharedCow;
use std::{ use std::{
collections::{btree_map, BTreeMap, HashMap}, collections::{btree_map, BTreeMap, HashMap},
sync::{mpsc, Arc}, sync::{atomic::AtomicBool, mpsc, Arc},
}; };
/// Plugin calls that are received by the [`EngineInterfaceManager`] for handling. /// Plugin calls that are received by the [`EngineInterfaceManager`] for handling.
@ -64,6 +64,8 @@ struct EngineInterfaceState {
mpsc::Sender<(EngineCallId, mpsc::Sender<EngineCallResponse<PipelineData>>)>, mpsc::Sender<(EngineCallId, mpsc::Sender<EngineCallResponse<PipelineData>>)>,
/// The synchronized output writer /// The synchronized output writer
writer: Box<dyn PluginWrite<PluginOutput>>, writer: Box<dyn PluginWrite<PluginOutput>>,
// Mirror signals from `EngineState`
signals: Signals,
/// Registered Ctrl-C handlers /// Registered Ctrl-C handlers
ctrlc_handlers: ctrlc::Handlers, ctrlc_handlers: ctrlc::Handlers,
} }
@ -119,6 +121,7 @@ impl EngineInterfaceManager {
stream_id_sequence: Sequence::default(), stream_id_sequence: Sequence::default(),
engine_call_subscription_sender: subscription_tx, engine_call_subscription_sender: subscription_tx,
writer: Box::new(writer), writer: Box::new(writer),
signals: Signals::new(Arc::new(AtomicBool::new(false))),
ctrlc_handlers: ctrlc::Handlers::new(), ctrlc_handlers: ctrlc::Handlers::new(),
}), }),
protocol_info_mut, protocol_info_mut,
@ -239,7 +242,6 @@ impl InterfaceManager for EngineInterfaceManager {
fn consume(&mut self, input: Self::Input) -> Result<(), ShellError> { fn consume(&mut self, input: Self::Input) -> Result<(), ShellError> {
log::trace!("from engine: {:?}", input); log::trace!("from engine: {:?}", input);
match input { match input {
PluginInput::Hello(info) => { PluginInput::Hello(info) => {
let info = Arc::new(info); let info = Arc::new(info);
@ -336,6 +338,7 @@ impl InterfaceManager for EngineInterfaceManager {
self.send_engine_call_response(id, response) self.send_engine_call_response(id, response)
} }
PluginInput::Ctrlc => { PluginInput::Ctrlc => {
self.state.signals.trigger();
self.state.ctrlc_handlers.run(); self.state.ctrlc_handlers.run();
Ok(()) Ok(())
} }
@ -975,6 +978,10 @@ impl EngineInterface {
self.write(PluginOutput::CallResponse(self.context()?, response))?; self.write(PluginOutput::CallResponse(self.context()?, response))?;
self.flush() self.flush()
} }
pub fn signals(&self) -> &Signals {
&self.state.signals
}
} }
impl Interface for EngineInterface { impl Interface for EngineInterface {

View File

@ -56,6 +56,12 @@ impl Signals {
} }
} }
pub fn trigger(&self) {
if let Some(signals) = &self.signals {
signals.store(true, Ordering::Relaxed);
}
}
/// Returns whether an interrupt has been triggered. /// Returns whether an interrupt has been triggered.
#[inline] #[inline]
pub fn interrupted(&self) -> bool { pub fn interrupted(&self) -> bool {

View File

@ -41,6 +41,7 @@ impl PluginCommand for Ctrlc {
eprintln!("waiting for ctrl-c signal..."); eprintln!("waiting for ctrl-c signal...");
receiver.recv().expect("handler went away"); receiver.recv().expect("handler went away");
eprintln!("interrupt status: {:?}", engine.signals().interrupted());
eprintln!("peace."); eprintln!("peace.");
Ok(PipelineData::Empty) Ok(PipelineData::Empty)