6 #include <unordered_map> 8 #include <sys/signalfd.h> 19 pthread_sigmask (SIG_SETMASK,
nullptr, &
_orgSigMask);
38 pthread_sigmask (SIG_SETMASK, &d->_orgSigMask,
nullptr);
50 if ( d->_signalRefCount.count(signum) != 0 && d->_signalRefCount[signum] > 0 ) {
52 d->_signalRefCount[signum]++;
55 const auto &handleError = [&]() {
56 d->_signalRefCount.erase ( signum );
61 d->_signalRefCount[signum] = 1;
64 sigemptyset (&sigMask );
67 for (
const auto &sig : d->_signalRefCount ) {
68 sigaddset(&sigMask, sig.first);
74 if (pthread_sigmask (SIG_BLOCK, &sigMask, NULL) == -1) {
80 zypp::AutoFD aFd = signalfd ( d->_signalFd, &sigMask, SFD_NONBLOCK | SFD_CLOEXEC );
85 if ( d->_signalFd != aFd ) {
98 if ( !d->_signalRefCount.count(signum) || d->_signalRefCount[signum] == 0 ) {
101 d->_signalRefCount[signum]--;
103 if ( d->_signalRefCount[signum] <= 0 ) {
105 d->_signalRefCount.erase(signum);
109 sigemptyset ( &sigMask );
110 for (
const auto &sig : d->_signalRefCount ) {
111 sigaddset(&sigMask, sig.first);
114 auto res = signalfd ( d->_signalFd, &sigMask, SFD_NONBLOCK | SFD_CLOEXEC );
116 WAR <<
"Failed to update signalfd with errno: " <<
zypp::Errno() << std::endl;
121 sigemptyset ( &sigMask );
122 sigaddset(&sigMask, signum);
123 pthread_sigmask(SIG_UNBLOCK, &sigMask, NULL);
126 if ( d->_signalRefCount.size () == 0 ) {
135 return d_func()->_sigReceived;
141 struct signalfd_siginfo sfd_si;
142 if (
read(fd, &sfd_si,
sizeof(sfd_si)) == -1 ) {
143 WAR <<
"Failed to read from signalfd" << std::endl;
147 if ( d->_signalRefCount.count ( sfd_si.ssi_signo ))
148 d->_sigReceived.emit( sfd_si.ssi_signo );
150 WAR <<
"Received unexpected UNIX signal on signalFD: " << sfd_si.ssi_signo << std::endl;
void onSignal(int signal) override
void onFdReady(int fd, int events) override
SignalProxy< void(int signum)> sigReceived()
static UnixSignalSourceRef create()
Convenience errno wrapper.
void removeFdWatch(int fd)
std::map< std::string, std::string > read(const Pathname &_path)
Read sysconfig file path_r and return (key,valye) pairs.
AutoDispose<int> calling ::close
std::unordered_map< int, int > _signalRefCount
void updateFdWatch(int fd, int mode)
~UnixSignalSource() override
UnixSignalSourcePrivate(UnixSignalSource &p)
bool addSignal(int signum)
void resetDispose()
Set no dispose function.
ZYPP_IMPL_PRIVATE(UnixSignalSource)
#define ZYPP_DECLARE_PUBLIC(Class)
bool removeSignal(int signum)
Signal< void(int)> _sigReceived