#include "util.hpp" #include #include #include #include #include #include void Poller::add_fd(int fd, std::function handler) { pfds.emplace_back(pollfd{.fd = fd, .events = POLLIN, .revents = 0}); handlers.emplace_back(std::move(handler)); } int Poller::check_events() { int ret = 0; if ((ret = poll(this->pfds.data(), this->pfds.size(), -1)) != -1 && errno != EINTR) { for (unsigned i = 0; i < pfds.size(); i++) { if ((pfds[i].revents & POLLIN) != 0) { if (handlers[i](pfds[i].fd) == -1) { return -1; } pfds[i].revents = 0; pfds[i].events = POLLIN; } } } return ret; } unique_fd::~unique_fd() { if (this->fd != -1) { close(this->fd); } }