32 #include <sys/epoll.h>
33 #include <system_error>
42 using namespace scc::util;
46 m_fd = epoll_create1(0);
78 throw std::runtime_error(
"No poll events specified");
84 if (m_polls.find(fd) == m_polls.end())
86 if (epoll_ctl(m_fd, EPOLL_CTL_ADD, fd, &ev) == -1)
88 throw std::system_error(errno, std::system_category());
93 if (epoll_ctl(m_fd, EPOLL_CTL_MOD, fd, &ev) == -1)
95 throw std::system_error(errno, std::system_category());
103 if (m_polls.find(fd) != m_polls.end())
105 if (epoll_ctl(m_fd, EPOLL_CTL_DEL, fd, NULL) == -1)
107 throw std::system_error(errno, std::system_category());
115 epoll_event evs[m_polls.size()];
119 n = epoll_wait(m_fd, evs, m_polls.size(), timeout_ms);
121 while (n == -1 && errno == EINTR);
124 std::stringstream st;
125 st <<
"epoll_wait()";
126 throw std::system_error(errno, std::system_category(), st.str());
129 for (
int i = 0; i < n; i++)
131 if (m_polls.find(evs[i].data.fd) == m_polls.end())
133 throw std::runtime_error(
"invalid poll event returned");
135 m_events[evs[i].data.fd] = converteflags(evs[i].events);
139 int Poller::converteflags(
int flags)
147 if (flags & EPOLLOUT)
151 if (flags & EPOLLRDHUP)
155 if (flags & EPOLLPRI)
159 if (flags & EPOLLHUP)
163 if (flags & EPOLLERR)
173 auto e = m_events.find(fd);
174 if (e == m_events.end())
void set(int, int)
Add a file desriptor to poller.
void remove(int)
Remove a file descriptor from poller.
@ priority
There is some exceptional condition on the file descriptor. E.g. There is out-of-band data on a TCP s...
@ output
File descriptor is available for write operations.
@ hup
Hang up. The local or peer connection has been closed.
@ read_hup
For stream sockets, peer connection (or local connection) has been shut down.
@ input
File descriptor is available for read operations.
void wait()
Wait forever for an event.
int event(int)
Return flags which were polled for this file descriptor.
int safe_close(int fd)
Signal safe close.
Linux kernel i/o event notification (poller).
Signal-safe C library wrapper.