20enum class event_type { read, write, read_write };
31 virtual ~poll_base() {}
32 virtual bool add(descriptor fd, event_type type,
void *ptr) = 0;
33 virtual bool del(descriptor fd) = 0;
35 virtual int wait(std::vector<poll_event>& events, int64_t timeout_us) = 0;
38class poll :
public poll_base {
43 bool add(descriptor fd, event_type type,
void *ptr)
override {
44 if (fdmap_.find(fd) != fdmap_.end()) {
47 fdmap_[fd.fd()] = std::make_pair(type, ptr);
52 bool del(descriptor fd)
override {
53 if (fdmap_.find(fd) == fdmap_.end()) {
56 fdmap_.erase(fd.fd());
61 int wait(std::vector<poll_event>& events, int64_t timeout_us)
override {
63 int r = ::poll(fdset_.data(), fdset_.size(), timeout_us < 0 ? -1 : timeout_us / 1000);
69 for (
auto it = fdset_.begin(); i < r && it != fdset_.end(); ++it) {
70 if (it->revents & POLLIN && it->revents & POLLOUT) {
71 events[i].fd = it->fd;
72 events[i].type = event_type::read_write;
73 events[i].ptr = fdmap_[it->fd].second;
87 fdset_.resize(fdmap_.size());
89 for (
const auto& pair : fdmap_) {
90 fdset_[i].fd = pair.first;
91 switch (pair.second.first) {
92 case event_type::read:
93 fdset_[i].events = POLLIN;
95 case event_type::write:
96 fdset_[i].events = POLLOUT;
99 fdset_[i].events = POLLIN | POLLOUT;
101 fdset_[i].revents = 0;
109 std::map<int, std::pair<event_type, void *>> fdmap_;
110 std::vector<struct ::pollfd> fdset_;
120 operator bool()
const {
return epfd_ != -1; }
122 bool add(
int fd,
void *ptr);
126 bool wait(std::vector<void *>& ptrs);
128 static const int maxevents;
132 struct epoll_event *evlist_;
141 enum event {
none, read, write };
147 static int poll(
struct pollfd fdarray[], nfds_t nfds,
int timeout) { return ::poll(fdarray, nfds, timeout); }
Definition: descriptor.h:6
Definition: algorithm.h:10