Clio  develop
The XRP Ledger API server.
Loading...
Searching...
No Matches
SignalsHandler.hpp
1#pragma once
2
3#include "util/config/ConfigDefinition.hpp"
4#include "util/log/Logger.hpp"
5
6#include <boost/signals2/signal.hpp>
7
8#include <atomic>
9#include <chrono>
10#include <concepts>
11#include <condition_variable>
12#include <csignal>
13#include <cstdlib>
14#include <functional>
15#include <mutex>
16#include <thread>
17
18namespace util {
19namespace impl {
20
21class SignalsHandlerStatic;
22
23} // namespace impl
24
33 enum class State { WaitingForSignal, GracefulShutdown, ForceExit, NormalExit };
34
35 std::chrono::steady_clock::duration gracefulPeriod_;
36 std::function<void()> forceExitHandler_;
37
38 boost::signals2::signal<void()> stopSignal_;
39
40 std::atomic<bool> signalReceived_{false};
41 std::atomic<State> state_{State::WaitingForSignal};
42
43 std::mutex mutex_;
44 std::condition_variable cv_;
45 std::thread workerThread_;
46
47 friend class impl::SignalsHandlerStatic;
48
49public:
53 enum class Priority { StopFirst = 0, Normal = 1, StopLast = 2 };
54
63 std::function<void()> forceExitHandler = kDEFAULT_FORCE_EXIT_HANDLER
64 );
65
66 SignalsHandler(SignalsHandler const&) = delete;
69 operator=(SignalsHandler const&) = delete;
71 operator=(SignalsHandler&&) = delete;
72
77
85 template <std::invocable SomeCallback>
86 void
87 subscribeToStop(SomeCallback&& callback, Priority priority = Priority::Normal)
88 {
89 stopSignal_.connect(static_cast<int>(priority), std::forward<SomeCallback>(callback));
90 }
91
96 void
98
99 static constexpr auto kHANDLED_SIGNALS = {SIGINT, SIGTERM};
100
101private:
107 static void
108 setHandler(void (*handler)(int) = nullptr);
109
113 void
114 runStateMachine();
115
116 static constexpr auto kDEFAULT_FORCE_EXIT_HANDLER = []() { std::exit(EXIT_FAILURE); };
117};
118
119} // namespace util
Class handling signals.
Definition SignalsHandler.hpp:29
SignalsHandler(util::config::ClioConfigDefinition const &config, std::function< void()> forceExitHandler=kDEFAULT_FORCE_EXIT_HANDLER)
Create SignalsHandler object.
Definition SignalsHandler.cpp:49
Priority
Enum for stop priority.
Definition SignalsHandler.hpp:53
void subscribeToStop(SomeCallback &&callback, Priority priority=Priority::Normal)
Subscribe to stop signal.
Definition SignalsHandler.hpp:87
void notifyGracefulShutdownComplete()
Notify the signal handler that graceful shutdown has completed. This allows the handler to transition...
Definition SignalsHandler.cpp:78
~SignalsHandler()
Destructor of SignalsHandler.
Definition SignalsHandler.cpp:63
All the config data will be stored and extracted from this class.
Definition ConfigDefinition.hpp:31
This namespace contains various utilities.
Definition AccountUtils.hpp:11