Google OR-Tools v9.11
a fast and portable software suite for combinatorial optimization
Loading...
Searching...
No Matches
sigint.cc
Go to the documentation of this file.
1// Copyright 2010-2024 Google LLC
2// Licensed under the Apache License, Version 2.0 (the "License");
3// you may not use this file except in compliance with the License.
4// You may obtain a copy of the License at
5//
6// http://www.apache.org/licenses/LICENSE-2.0
7//
8// Unless required by applicable law or agreed to in writing, software
9// distributed under the License is distributed on an "AS IS" BASIS,
10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11// See the License for the specific language governing permissions and
12// limitations under the License.
13
14#include "ortools/util/sigint.h"
15
16#include <csignal>
17#include <functional>
18
20
21namespace operations_research {
22
23void SigintHandler::Register(const std::function<void()>& f) {
24 handler_ = [this, f]() -> void {
25 ++num_sigint_calls_;
26 if (num_sigint_calls_ >= 3) {
27 LOG(INFO) << "^C pressed " << num_sigint_calls_
28 << " times. Forcing termination.";
29 exit(EXIT_FAILURE);
30 }
31 LOG(INFO) << "^C pressed " << num_sigint_calls_ << " times. "
32 << "Interrupting the solver. Press 3 times to force termination.";
33 if (num_sigint_calls_ == 1) f();
34 };
35 signal(SIGINT, &ControlCHandler);
36}
37
38// This method will be called by the system after the SIGINT signal.
39// The parameter is the signal received.
40void SigintHandler::ControlCHandler(int sig) { handler_(); }
41
42// Unregister the SIGINT handler.
43SigintHandler::~SigintHandler() { signal(SIGINT, SIG_DFL); }
44
45thread_local std::function<void()> SigintHandler::handler_;
46
47} // namespace operations_research
~SigintHandler()
Unregister the SIGINT handler.
Definition sigint.cc:43
void Register(const std::function< void()> &f)
Definition sigint.cc:23
In SWIG mode, we don't want anything besides these top-level includes.