Skip to main content

sqlite_graphrag/
signals.rs

1//! Cross-platform signal handling: SIGINT, SIGTERM, SIGHUP.
2
3use std::sync::atomic::Ordering;
4
5/// Registers the global shutdown handler for Ctrl+C / SIGTERM / SIGHUP.
6///
7/// First signal: sets [`SHUTDOWN`](crate::SHUTDOWN) flag, cancels the global
8/// cancellation token, logs graceful shutdown intent.
9///
10/// Second signal: calls [`std::process::exit(130)`] for immediate termination
11/// following Unix convention (128 + SIGINT=2).
12pub fn register_shutdown_handler() {
13    if let Err(e) = ctrlc::set_handler(move || {
14        let prev = crate::SIGNAL_COUNT.fetch_add(1, Ordering::AcqRel);
15        if prev == 0 {
16            crate::SHUTDOWN.store(true, Ordering::Release);
17            crate::SIGNAL_NUMBER.store(2, Ordering::Release);
18            crate::cancel_token().cancel();
19            tracing::warn!(
20                target: "signals",
21                "shutdown signal received; finishing current operation gracefully"
22            );
23        } else {
24            eprintln!("\nForced shutdown (second signal received). Exiting immediately.");
25            std::process::exit(130);
26        }
27    }) {
28        tracing::warn!(target: "signals", error = %e, "signal handler registration failed");
29    }
30}