4#ifndef _Stroika_Foundation_Execution_SignalHandlers_h_
5#define _Stroika_Foundation_Execution_SignalHandlers_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
13#include "Stroika/Foundation/Common/Common.h"
15#include "Stroika/Foundation/Containers/Mapping.h"
16#include "Stroika/Foundation/Containers/Set.h"
17#include "Stroika/Foundation/Execution/Signals.h"
97 static constexpr Type eDirect = Type::eDirect;
102 static constexpr Type eSafe = Type::eSafe;
115 SignalHandler (
void (*signalHandler) (SignalID)
noexcept,
Type type = Type::eDEFAULT);
117 SignalHandler (
const function<
void (SignalID)>& signalHandler,
Type type = Type::eDEFAULT);
120 nonvirtual
Type GetType ()
const;
126 nonvirtual
void operator() (SignalID i)
const;
148 function<void (SignalID)> fCall_;
193 [[deprecated (
"Since Stroika v3.0d21, use SignalHandlerRegistry::sThe")]]
static SignalHandlerRegistry& Get ()
209 class SafeSignalsManager;
308 RWSynchronized<Containers::Mapping<SignalID, Containers::Set<SignalHandler>>> fDirectHandlers_;
311 mutable atomic<unsigned int> fDirectSignalHandlersCache_Lock_{0};
312 vector<function<void (SignalID)>> fDirectSignalHandlersCache_[NSIG];
315 static void FirstPassSignalHandler_ (SignalID signal);
359#if defined(__cpp_lib_atomic_shared_ptr)
360 static inline atomic<shared_ptr<Rep_>> sTheRep_{
nullptr};
362 static inline shared_ptr<Rep_> sTheRep_{
nullptr};
376#include "SignalHandlers.inl"
#define Stroika_Define_Enum_Bounds(FIRST_ITEM, LAST_ITEM)
String is like std::u32string, except it is much easier to use, often much more space efficient,...
An opaque ID - each New () one never given before, in this process - of a type of its own for each TA...
static UniqueID New()
One never given before in this process - by New () of any TAG.
Set<T> is a container of T, where once an item is added, additionally adds () do nothing.
nonvirtual bool operator==(const SignalHandler &rhs) const
True only for the same SignalHandler, or a copy of it -.
nonvirtual strong_ordering operator<=>(const SignalHandler &rhs) const
Each SignalHandler constructed is its own, kept by its copies: another made the same way - even from ...
nonvirtual void operator()(SignalID i) const
static void DefaultCrashSignalHandler(SignalID signal)
static Containers::Set< SignalID > GetStandardCrashSignals()
nonvirtual void AddSignalHandler(SignalID signal, const SignalHandler &handler)
nonvirtual void SetSignalHandlers(SignalID signal)
nonvirtual void RemoveSignalHandler(SignalID signal, const SignalHandler &handler)
nonvirtual void SetStandardCrashHandlerSignals(SignalHandler handler=SignalHandler{DefaultCrashSignalHandler, SignalHandler::Type::eDirect}, const Containers::Set< SignalID > &forSignals=GetStandardCrashSignals())
static const SignalHandler kIGNORED
nonvirtual Containers::Set< SignalID > GetHandledSignals() const
nonvirtual Containers::Set< SignalHandler > GetSignalHandlers(SignalID signal) const
static SignalHandlerRegistry sThe