23#if ORTOOLS_TARGET_OS_SUPPORTS_THREADS
27void SigintHandler::Register(
const std::function<
void()>& f) {
28 handler_ = [
this, f]() ->
void {
29 const int num_calls = ++num_calls_;
32 <<
"^C pressed " << num_calls <<
" times. "
33 <<
"Interrupting the solver. Press 3 times to force termination.";
34 if (num_calls == 1) f();
35 }
else if (num_calls == 3) {
36 LOG(INFO) <<
"^C pressed 3 times. Forcing termination.";
42 signal(SIGINT, &SigHandler);
47void SigintHandler::SigHandler(
int) { handler_(); }
50SigintHandler::~SigintHandler() {
51 if (handler_ !=
nullptr) signal(SIGINT, SIG_DFL);
54thread_local std::function<void()> SigintHandler::handler_;
56void SigtermHandler::Register(
const std::function<
void()>& f) {
57 handler_ = [f]() ->
void { f(); };
58 signal(SIGTERM, &SigHandler);
63void SigtermHandler::SigHandler(
int) { handler_(); }
66SigtermHandler::~SigtermHandler() {
67 if (handler_ !=
nullptr) signal(SIGTERM, SIG_DFL);
70thread_local std::function<void()> SigtermHandler::handler_;