flare_core_runtime/signal/
unix.rs1use super::ShutdownSignal;
6use std::pin::Pin;
7
8#[derive(Debug, Clone, Copy)]
10pub enum UnixSignalKind {
11 Terminate,
13 Interrupt,
15}
16
17#[cfg(target_family = "unix")]
29pub struct UnixSignal {
30 kind: UnixSignalKind,
31 name: String,
32}
33
34#[cfg(target_family = "unix")]
35impl UnixSignal {
36 pub fn new(kind: UnixSignalKind) -> Self {
38 let name = match kind {
39 UnixSignalKind::Terminate => "sigterm",
40 UnixSignalKind::Interrupt => "sigint",
41 };
42 Self {
43 kind,
44 name: name.to_string(),
45 }
46 }
47}
48
49#[cfg(target_family = "unix")]
50impl ShutdownSignal for UnixSignal {
51 fn wait(&mut self) -> Pin<Box<dyn std::future::Future<Output = ()> + Send + '_>> {
52 use tokio::signal::unix::{SignalKind, signal};
53
54 let kind = match self.kind {
55 UnixSignalKind::Terminate => SignalKind::terminate(),
56 UnixSignalKind::Interrupt => SignalKind::interrupt(),
57 };
58
59 Box::pin(async move {
60 let mut signal = signal(kind).expect("Failed to register signal handler");
61 let _ = signal.recv().await;
62 })
63 }
64
65 fn name(&self) -> &str {
66 &self.name
67 }
68}
69
70#[cfg(not(target_family = "unix"))]
71pub struct UnixSignal {
72 _kind: UnixSignalKind,
73 name: String,
74}
75
76#[cfg(not(target_family = "unix"))]
77impl UnixSignal {
78 pub fn new(kind: UnixSignalKind) -> Self {
79 let name = match kind {
80 UnixSignalKind::Terminate => "sigterm",
81 UnixSignalKind::Interrupt => "sigint",
82 };
83 Self {
84 _kind: kind,
85 name: name.to_string(),
86 }
87 }
88}
89
90#[cfg(not(target_family = "unix"))]
91impl ShutdownSignal for UnixSignal {
92 fn wait(&mut self) -> Pin<Box<dyn std::future::Future<Output = ()> + Send + '_>> {
93 Box::pin(std::future::pending::<()>())
95 }
96
97 fn name(&self) -> &str {
98 &self.name
99 }
100}
101
102#[cfg(test)]
103mod tests {
104 use super::*;
105
106 #[test]
107 fn test_unix_signal_new() {
108 let signal = UnixSignal::new(UnixSignalKind::Terminate);
109 assert_eq!(signal.name(), "sigterm");
110
111 let signal = UnixSignal::new(UnixSignalKind::Interrupt);
112 assert_eq!(signal.name(), "sigint");
113 }
114}