@@ -8,13 +8,18 @@ use clap::Parser;
8
8
#[ cfg( feature = "sentry" ) ]
9
9
use cli:: configure_sentry;
10
10
use miette:: { Context , IntoDiagnostic , Result } ;
11
- use spfs:: Error ;
12
11
use spfs_cli_common as cli;
13
12
use spfs_cli_common:: CommandName ;
14
13
use tokio:: io:: AsyncReadExt ;
15
- use tokio:: signal:: unix:: { signal, SignalKind } ;
16
14
use tokio:: time:: timeout;
17
15
16
+ mod signal;
17
+ #[ cfg( unix) ]
18
+ use signal:: unix_signal_handler:: UnixSignalHandler as SignalHandlerImpl ;
19
+ use signal:: SignalHandler ;
20
+ #[ cfg( windows) ]
21
+ use windows_signal_handler:: WindowsSignalHandler as SignalHandlerImpl ;
22
+
18
23
fn main ( ) -> Result < ( ) > {
19
24
// because this function exits right away it does not
20
25
// properly handle destruction of data, so we put the actual
@@ -86,11 +91,10 @@ impl CmdMonitor {
86
91
rt. block_on ( self . wait_for_ready ( ) ) ;
87
92
// clean up this runtime and all other threads before detaching
88
93
drop ( rt) ;
89
-
94
+ # [ cfg ( unix ) ]
90
95
nix:: unistd:: daemon ( self . no_chdir , self . no_close )
91
96
. into_diagnostic ( )
92
97
. wrap_err ( "Failed to daemonize the monitor process" ) ?;
93
-
94
98
#[ cfg( feature = "sentry" ) ]
95
99
{
96
100
// Initialize sentry after the call to `daemon` so it is safe for
@@ -142,12 +146,7 @@ impl CmdMonitor {
142
146
}
143
147
144
148
pub async fn run_async ( & mut self , config : & spfs:: Config ) -> Result < i32 > {
145
- let mut interrupt = signal ( SignalKind :: interrupt ( ) )
146
- . map_err ( |err| Error :: process_spawn_error ( "signal()" , err, None ) ) ?;
147
- let mut quit = signal ( SignalKind :: quit ( ) )
148
- . map_err ( |err| Error :: process_spawn_error ( "signal()" , err, None ) ) ?;
149
- let mut terminate = signal ( SignalKind :: terminate ( ) )
150
- . map_err ( |err| Error :: process_spawn_error ( "signal()" , err, None ) ) ?;
149
+ let signal_future = SignalHandlerImpl :: build_signal_future ( ) ;
151
150
152
151
let repo = spfs:: open_repository ( & self . runtime_storage ) . await ?;
153
152
let storage = spfs:: runtime:: Storage :: new ( repo) ?;
@@ -165,9 +164,7 @@ impl CmdMonitor {
165
164
}
166
165
// we explicitly catch any signal related to interruption
167
166
// and will act by cleaning up the runtime early
168
- _ = terminate. recv( ) => Err ( spfs:: Error :: String ( "Terminate signal received, cleaning up runtime early" . to_string( ) ) ) ,
169
- _ = interrupt. recv( ) => Err ( spfs:: Error :: String ( "Interrupt signal received, cleaning up runtime early" . to_string( ) ) ) ,
170
- _ = quit. recv( ) => Err ( spfs:: Error :: String ( "Quit signal received, cleaning up runtime early" . to_string( ) ) ) ,
167
+ _ = signal_future => Err ( spfs:: Error :: String ( "Signal received, cleaning up runtime early" . to_string( ) ) ) ,
171
168
} ;
172
169
tracing:: trace!( "runtime empty of processes " ) ;
173
170
0 commit comments