///////////////////////////////ct.p////////////////////////////////////////
template <class Value>
-prefix_ bool senf::scheduler::Poller<Value>::set(int fd, int events, Value * data)
+prefix_ bool senf::scheduler::detail::Poller<Value>::set(int fd, int events, Value * data)
{
struct epoll_event ev = { events, { data } };
if (epoll_ctl(epollFd_, EPOLL_CTL_ADD, fd, &ev) != -1)
return true;
if (errno == EPERM)
return false;
- throw SystemException("epolll_ctl");
+ SENF_THROW_SYSTEM_EXCEPTION("epolll_ctl()");
}
template <class Value>
-prefix_ void senf::scheduler::Poller<Value>::remove(int fd)
+prefix_ void senf::scheduler::detail::Poller<Value>::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 <class Value>
-prefix_ typename senf::scheduler::Poller<Value>::range senf::scheduler::Poller<Value>::wait()
+prefix_ typename senf::scheduler::detail::Poller<Value>::range senf::scheduler::detail::Poller<Value>::wait()
{
static epoll_event events[NumEvents];
int rv (0);
if (rv == -1) {
if (errno == EINTR)
continue;
- throw SystemException("epoll_wait");
+ SENF_THROW_SYSTEM_EXCEPTION("epoll_wait()");
}
break;
}