36 #ifndef SIGNAL_MONITOR_H 37 #define SIGNAL_MONITOR_H 42 #include "final/eventloop/monitor.h" 43 #include "final/eventloop/pipedata.h" 44 #include "final/util/fstring.h" 77 auto getClassName()
const ->
FString override;
81 void init (
int, handler_t, T&&);
82 void trigger (
short)
override;
89 static constexpr
int INVALID_SIGNAL{-1};
90 static constexpr std::uint64_t SIGNAL_NOTIFICATION{1U};
92 #if defined(NSIG) && (NSIG > 0) 93 static constexpr
int NUMBER_OF_SIGNALS{NSIG};
94 #elif defined(_NSIG) && (_NSIG > 0) 95 static constexpr
int NUMBER_OF_SIGNALS{_NSIG};
97 static constexpr
int NUMBER_OF_SIGNALS{65};
105 static void onSignal (
int) noexcept;
107 void validate (
int,
const handler_t&)
const;
108 void handledAlarmSignal()
const;
109 void ensureSignalIsUnmonitored()
const;
111 void installSignalHandler();
112 void cleanupResources() noexcept;
113 void enterMonitorInstanceInTable();
116 int signal_number{INVALID_SIGNAL};
117 PipeData signal_pipe{NO_FILE_DESCRIPTOR, NO_FILE_DESCRIPTOR};
118 std::unique_ptr<SigactionImpl> impl;
123 inline auto SignalMonitor::getClassName()
const ->
FString 124 {
return "SignalMonitor"; }
127 inline auto SignalMonitor::getSigactionImpl()
const ->
const SigactionImpl*
128 {
return impl.get(); }
131 inline auto SignalMonitor::getSigactionImpl() ->
SigactionImpl*
132 {
return impl.get(); }
135 template <
typename T>
136 inline void SignalMonitor::init (
int sn, handler_t hdl, T&& uc)
142 setHandler (std::move(hdl));
143 setUserContext (std::forward<T>(uc));
148 signal_number = INVALID_SIGNAL;
149 setHandler(handler_t{});
157 inline void SignalMonitor::validate (
int sn,
const handler_t& hdl)
const 159 if ( isInitialized() )
160 throw monitor_error{
"This instance has already been initialised."};
162 if ( sn <= 0 || sn >= NUMBER_OF_SIGNALS )
163 throw monitor_error{
"Invalid signal number: must be > 0 and < " 164 + std::to_string(NUMBER_OF_SIGNALS) };
172 #endif // SIGNAL_MONITOR_H Definition: signal_monitor.h:53
Definition: eventloop.h:49
Definition: class_template.cpp:25
Definition: signal_monitor.cpp:66
Definition: pipedata.h:48