00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026
00027
00028
00029 #include <errno.h>
00030 #include <senf/Utils/Exception.hh>
00031
00032 #define prefix_
00033
00034
00035 template <class Value>
00036 prefix_ bool senf::scheduler::detail::Poller<Value>::set(int fd, int events, Value * data)
00037 {
00038 struct epoll_event ev = { events, { data } };
00039 if (epoll_ctl(epollFd_, EPOLL_CTL_ADD, fd, &ev) != -1)
00040 return true;
00041 if (errno == EEXIST)
00042 if (epoll_ctl(epollFd_, EPOLL_CTL_MOD, fd, &ev) != -1)
00043 return true;
00044 if (errno == EPERM)
00045 return false;
00046 SENF_THROW_SYSTEM_EXCEPTION("epolll_ctl()");
00047 }
00048
00049 template <class Value>
00050 prefix_ void senf::scheduler::detail::Poller<Value>::remove(int fd)
00051 {
00052 if (epoll_ctl(epollFd_, EPOLL_CTL_DEL, fd, 0) == -1)
00053 if (errno != ENOENT && errno != EBADF && errno != EPERM)
00054
00055
00056
00057
00058
00059
00060 SENF_THROW_SYSTEM_EXCEPTION("epoll_ctl()");
00061 }
00062
00063 template <class Value>
00064 prefix_ typename senf::scheduler::detail::Poller<Value>::range senf::scheduler::detail::Poller<Value>::wait()
00065 {
00066 static epoll_event events[NumEvents];
00067 int rv (0);
00068 rv = epoll_wait(epollFd_, events, NumEvents, timeout_);
00069 if (rv == -1) {
00070 if (errno == EINTR)
00071 rv = 0;
00072 else
00073 SENF_THROW_SYSTEM_EXCEPTION("epoll_wait()");
00074 }
00075 return boost::make_iterator_range(
00076 boost::make_transform_iterator(events, GetPollResult()),
00077 boost::make_transform_iterator(events+rv, GetPollResult()) );
00078 }
00079
00080
00081 #undef prefix_
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092