X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FPoller.ct;h=92a13e627f8d996a43e4222809a4dfa5f507a933;hb=fd3a0e8ac95d1158e9ea661ddf9187b67c70169f;hp=d0737a889bdea0b5651df0c6cb0ef2be9a026078;hpb=919e588a2c387c9a910aa8761e65155a0d205bba;p=senf.git diff --git a/Scheduler/Poller.ct b/Scheduler/Poller.ct index d0737a8..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) @@ -43,19 +43,25 @@ prefix_ bool senf::scheduler::Poller::set(int fd, int events, Value * dat return true; if (errno == EPERM) return false; - throw SystemException("epolll_ctl"); + SENF_THROW_SYSTEM_EXCEPTION("epolll_ctl()"); } 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) - throw SystemException("epoll_ctl"); + 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); @@ -64,7 +70,7 @@ prefix_ typename senf::scheduler::Poller::range senf::scheduler::Poller