Utils/Termlib: Extend the completion API
[senf.git] / Scheduler / Poller.ct
index d0737a8..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) 
@@ -43,19 +43,25 @@ prefix_ bool senf::scheduler::Poller<Value>::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 <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);
@@ -64,7 +70,7 @@ prefix_ typename senf::scheduler::Poller<Value>::range senf::scheduler::Poller<V
         if (rv == -1) {
             if (errno == EINTR)
                 continue;
-            throw SystemException("epoll_wait");
+            SENF_THROW_SYSTEM_EXCEPTION("epoll_wait()");
         }
         break;
     }