2 #include "Mu2e-STMDAQ/utils/signal_handler.hh"
6 std::atomic<bool> SignalHandler::exit_requested(
false);
8 std::mutex SignalHandler::confirm_mutex;
10 std::condition_variable SignalHandler::confirm_cv;
12 std::thread SignalHandler::signal_thread;
16 std::shared_ptr<cpu_utils> SignalHandler::cpu =
nullptr;
19 SignalHandler::SignalHandler(
const std::shared_ptr<AsyncLogger>& logger_,
20 const std::shared_ptr<cpu_utils>& cpu_)
26 exit_requested.store(
false);
28 signal_thread = std::thread(listenForSignals);
34 void SignalHandler::handleSignal(
int signal)
37 exit_requested.store(
true);
40 if(instance && instance->logger)
42 instance->logger->log(
"SignalHandler: Signal " + std::to_string(signal) +
43 " received. Awaiting user confirmation.",
49 void SignalHandler::listenForSignals()
57 cpu->get_next_core(
"SignalHandler");
61 struct sigaction action;
63 action.sa_handler = handleSignal;
65 sigemptyset(&action.sa_mask);
69 sigaction(SIGINT, &action,
nullptr);
71 sigaction(SIGTERM, &action,
nullptr);
73 sigaction(SIGUSR1, &action,
nullptr);
76 if(instance && instance->logger)
78 instance->logger->log(
"SignalHandler: Signal handler initialised.", 1);
82 while(!stop::should_stop())
85 while(!exit_requested.load() && !stop::should_stop())
87 std::this_thread::sleep_for(
88 std::chrono::milliseconds(100));
92 if(stop::should_stop())
96 std::cout <<
"\nCaught interrupt. Are you sure you want to exit? (y/n): "
100 if(instance && instance->logger)
102 instance->logger->log(
"SignalHandler: Awaiting user confirmation for exit.",
108 std::chrono::steady_clock::now();
111 while(!(std::cin >> choice) &&
112 (std::chrono::steady_clock::now() - start_time) < std::chrono::seconds(5))
114 std::this_thread::sleep_for(
115 std::chrono::milliseconds(100));
119 if(choice ==
'y' || choice ==
'Y')
121 std::cout <<
"Exiting safely...\n";
122 if(instance && instance->logger)
124 instance->logger->log(
125 "SignalHandler: User confirmed exit. Stopping program.", 1);
129 stop::trigger_user_stop();
134 std::cout <<
"Resuming execution.\n";
135 if(instance && instance->logger)
137 instance->logger->log(
138 "SignalHandler: User denied exit. Resuming program.", 1);
140 exit_requested.store(
146 if(instance && instance->logger)
148 instance->logger->log(
"SignalHandler: Signal listener shutting down.", 1);