alpaqa matlab
Nonconvex constrained optimization
Loading...
Searching...
No Matches
cancel.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <atomic>
4#include <csignal>
5#include <memory>
6#include <stdexcept>
7
8namespace alpaqa {
9
10namespace detail {
11inline std::atomic<void *> solver_to_stop;
12}
13
14/**
15 * Attach SIGINT and SIGTERM handlers to stop the given solver.
16 * @param solver
17 * The solver that should be stopped by the handler.
18 * @return A RAII object that detaches the handler when destroyed.
19 */
20template <class Solver>
23 using solver_to_stop_t = decltype(solver_to_stop);
24 if constexpr (requires { solver.stop(); }) {
25 auto *old = solver_to_stop.exchange(&solver, std::memory_order_release);
26 if (old) {
27 throw std::logic_error(
28 "alpaqa-driver:attach_cancellation can only be used once");
29 }
30 auto handler = +[](int) {
31 if (auto *s = solver_to_stop.load(std::memory_order::acquire))
32 reinterpret_cast<Solver *>(s)->stop();
33 };
34#ifdef _WIN32
37#else
38 struct sigaction action;
39 action.sa_handler = handler;
40 sigemptyset(&action.sa_mask);
41 action.sa_flags = 0;
42 sigaction(SIGINT, &action, nullptr);
43 sigaction(SIGTERM, &action, nullptr);
44#endif
45 auto detach_solver = +[](solver_to_stop_t *p) {
46#ifdef _WIN32
49#else
50 struct sigaction action;
51 action.sa_handler = SIG_DFL;
52 sigemptyset(&action.sa_mask);
53 action.sa_flags = 0;
54 sigaction(SIGINT, &action, nullptr);
55 sigaction(SIGTERM, &action, nullptr);
56#endif
57 p->store(nullptr, std::memory_order_relaxed);
58 // Don't reorder this store with subsequent destruction of solver
59 std::atomic_signal_fence(std::memory_order_release);
60 };
61 return std::unique_ptr<solver_to_stop_t, decltype(detach_solver)>{
62 &solver_to_stop, detach_solver};
63 } else {
64 struct [[maybe_unused]] empty {};
65 return empty{};
66 }
67}
68
69} // namespace alpaqa
std::atomic< void * > solver_to_stop
Definition cancel.hpp:11
auto attach_cancellation(Solver &solver)
Attach SIGINT and SIGTERM handlers to stop the given solver.
Definition cancel.hpp:21
constexpr const auto inf
Definition config.hpp:85