def set_sig_handler(self, sig, handler): global _SigHandlers global _SigSetHandled signal.signal(sig, _SigHandler) _SigHandlers[sig] = handler pysigset.sigaddset(_SigSetHandled, sig)
def get_signalfd(self, sig, close_on_fork=True): sigset = SIGSET() sigaddset(sigset, sig) sigprocmask(SIG_BLOCK, sigset, NULL) fd = linuxfd.signalfd(signalset={sig}, nonBlocking=True) if close_on_fork: self._close_on_fork_fds.add(fd) return fd
def release(self, fd): # TODO: singledispatch if fd not in self._close_on_fork_fds: return self._close_on_fork_fds.remove(fd) fd.close() if isinstance(fd, linuxfd.signalfd): sigset = SIGSET() for sig in fd.signals(): sigaddset(sigset, sig) logger.debug('unblock sigset %s' % sigset) sigprocmask(SIG_UNBLOCK, sigset, NULL)
def unmask_sigio(self): sigemptyset(self.sigset) sigaddset(self.sigset, signal.SIGIO) sigprocmask(SIG_UNBLOCK, self.sigset, 0)