X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FPoller.ct;h=92a13e627f8d996a43e4222809a4dfa5f507a933;hb=a1fdb7bb122f0b05be809a922d4b7ef5e125fa67;hp=3948a221dc7c5e1b544eeff741187ae2257543ab;hpb=c6811d4b2fdd60eb33af627ae287dd228f435d14;p=senf.git diff --git a/Scheduler/Poller.ct b/Scheduler/Poller.ct index 3948a22..92a13e6 100644 --- a/Scheduler/Poller.ct +++ b/Scheduler/Poller.ct @@ -33,7 +33,7 @@ ///////////////////////////////ct.p//////////////////////////////////////// template -prefix_ bool senf::scheduler::Poller::set(int fd, int events, Value * data) +prefix_ bool senf::scheduler::detail::Poller::set(int fd, int events, Value * data) { struct epoll_event ev = { events, { data } }; if (epoll_ctl(epollFd_, EPOLL_CTL_ADD, fd, &ev) != -1) @@ -47,15 +47,21 @@ prefix_ bool senf::scheduler::Poller::set(int fd, int events, Value * dat } template -prefix_ void senf::scheduler::Poller::remove(int fd) +prefix_ void senf::scheduler::detail::Poller::remove(int fd) { if (epoll_ctl(epollFd_, EPOLL_CTL_DEL, fd, 0) == -1) - if (errno != ENOENT && errno != EBADF) + if (errno != ENOENT && errno != EBADF && errno != EPERM) + // Calling remove() on a file descriptor which is not registered + // is no error, it shall be ignored: + // ENOENT: Not part of the poller but a valid (open) fd + // EBADF: The fd has been closed already. The kernel automatically removes such fds + // from epoll structures + // EPERM: The fd does not support epoll and thus can never have been added SENF_THROW_SYSTEM_EXCEPTION("epoll_ctl()"); } template -prefix_ typename senf::scheduler::Poller::range senf::scheduler::Poller::wait() +prefix_ typename senf::scheduler::detail::Poller::range senf::scheduler::detail::Poller::wait() { static epoll_event events[NumEvents]; int rv (0);