// // Open_Signal: C // DEVICE_CMD Open_Signal(REBREQ *req) { //RL_Print("Open_Signal\n"); sigset_t mask; sigset_t overlap; #ifdef CHECK_MASK_OVERLAP //doesn't work yet if (sigprocmask(SIG_BLOCK, NULL, &mask) < 0) { goto error; } if (sigandset(&overlap, &mask, &req->special.signal.mask) < 0) { goto error; } if (!sigisemptyset(&overlap)) { req->error = EBUSY; return DR_ERROR; } #endif if (sigprocmask(SIG_BLOCK, &req->special.signal.mask, NULL) < 0) { goto error; } SET_OPEN(req); Signal_Device(req, EVT_OPEN); return DR_DONE; error: req->error = errno; return DR_ERROR; }
enum HANDLE_RESULT handle_signal(const sigset_t * sigs, pid_t child_pid) { if (sigisemptyset(sigs)) { return IGNORE; } if (! sigismember(sigs, SIGCHLD)) { if (kill_and_wait_sigchild(child_pid, SIGTERM, 1) == -1) { return KILL_CHILD; } } return WAIT_CHILD_EXIT; }
void Signal::Manager::add(uint32_t signal, Handler *handler) { Manager & manager = get(); if(sigisemptyset(&manager.mask) != 0) { manager.modify(EPOLLIN); manager.start(); } if(manager.handlers.find(signal) == manager.handlers.end()) { ::sigaddset(&manager.mask, signal); if(sigprocmask(SIG_BLOCK, &manager.mask, nullptr) < 0) { throw; } manager.fd = signalfd(manager.fd, &manager.mask, SFD_NONBLOCK | SFD_CLOEXEC); } manager.handlers[signal].insert(handler); }
BOOL sigset_empty(sigset_t a) { return sigisemptyset(&a); }