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}