51 ONIXS_ICEBOE_FORCEINLINE
54 return interruptDetectedFlag().load(std::memory_order_relaxed);
59 std::clog <<
"\nPress <Ctrl+C> to " << message <<
".." << std::endl;
66 ONIXS_ICEBOE_FORCEINLINE
67 static std::atomic<bool>& interruptDetectedFlag() noexcept
75 static void errorAbort(
int status,
const char* reason)
77 std::cerr <<
"Aborted due to status " << status <<
": " << (reason ? reason :
"no error message") << std::endl;
82 static void* signalWaiter(
void* )
84 try {ONIXS_ICEBOE_NAMESPACE::Threading::ThisThread::affinity(0);}
catch(...){}
89 sigwait(&signalSet(), &signalNumber);
91 if(signalNumber == SIGINT)
92 interruptDetectedFlag().store(
true);
94 std::cerr <<
"Signal " << signalNumber <<
" received and suppressed." << std::endl;
98 static void manageSignalsImpl() noexcept
100 constexpr int signals[] = { SIGINT, SIGPIPE };
102 pthread_t signalThreadId;
105 sigemptyset(&signalSet());
106 std::for_each(std::begin(signals), std::end(signals), [&](
int signal){sigaddset(&signalSet(), signal);});
109 const auto status = pthread_sigmask(SIG_BLOCK, &signalSet(),
nullptr);
111 errorAbort(status,
"Set signal mask");
114 const auto status = pthread_create(&signalThreadId,
nullptr, signalWaiter,
nullptr);
116 errorAbort(status,
"Create signalWaiter");
120 static sigset_t& signalSet() noexcept
126 static void manageSignalsImpl() noexcept
128 signal(SIGINT, &SignalHelper::signalHandler);
131 static void signalHandler(
int signal)
133 if (SIGINT == signal)
134 interruptDetectedFlag().store(
true);