1 #include "sig_handler.h" 2 #include "logging/logging.h" 4 std::atomic<bool> SigHandler::signal_marker_;
5 std::mutex SigHandler::exit_m_;
6 std::condition_variable SigHandler::exit_cv_;
7 bool SigHandler::exit_flag_;
14 SigHandler::~SigHandler() {
17 std::lock_guard<std::mutex> g(exit_m_);
20 exit_cv_.notify_all();
22 if (polling_thread_.joinable()) {
23 polling_thread_.join();
29 void SigHandler::start(
const std::function<
void()>& on_signal) {
30 if (polling_thread_.get_id() != boost::thread::id()) {
31 throw std::runtime_error(
"SigHandler can only be started once");
34 polling_thread_ = boost::thread([on_signal]() {
35 std::unique_lock<std::mutex> l(exit_m_);
37 bool got_signal = signal_marker_.exchange(
false);
44 if (exit_cv_.wait_for(l, std::chrono::seconds(1), [] { return exit_flag_; })) {
51 void SigHandler::signal(
int sig) { ::signal(sig, signal_handler); }
53 void SigHandler::signal_handler(
int sig) {
57 SigHandler::signal_marker_.compare_exchange_strong(v,
true);