astro_run/signals/
mod.rs

1mod signal;
2
3pub use signal::{AstroRunSignal, Signal};
4
5use crate::{Error, JobId, Result};
6use parking_lot::Mutex;
7use std::{collections::HashMap, sync::Arc};
8
9#[derive(Clone, Default)]
10pub struct SignalManager {
11  pub signals: Arc<Mutex<HashMap<JobId, AstroRunSignal>>>,
12}
13
14impl SignalManager {
15  pub fn new() -> Self {
16    Self::default()
17  }
18
19  pub fn register_signal(&self, job_id: JobId, signal: AstroRunSignal) {
20    self.signals.lock().insert(job_id, signal);
21  }
22
23  pub fn unregister_signal(&self, job_id: &JobId) {
24    self.signals.lock().remove(job_id);
25  }
26
27  pub fn get_signal(&self, job_id: &JobId) -> Option<AstroRunSignal> {
28    self.signals.lock().get(job_id).cloned()
29  }
30
31  pub fn cancel_job(&self, job_id: &JobId) -> Result<()> {
32    let signal = self
33      .get_signal(job_id)
34      .ok_or_else(|| Error::error(format!("Job {} not found", job_id)))?;
35
36    signal.cancel()?;
37
38    Ok(())
39  }
40}