Utils/Console: Add short help to 'ls' output
[senf.git] / Scheduler / Poller.ct
index 3948a22..92a13e6 100644 (file)
@@ -33,7 +33,7 @@
 ///////////////////////////////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) 
@@ -47,15 +47,21 @@ prefix_ bool senf::scheduler::Poller<Value>::set(int fd, int events, Value * dat
 }
 
 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)
+        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);