int fPollIns(int timeout,int fpc,FILE *fps[],int rdv[]) { int fi; int nready; nready = _fPollIns(timeout,fpc,fps,rdv); if( nready == 0 ){ for( fi = 0; fi < fpc; fi++ ) if( poll_error(fileno(fps[fi])) ) return -1; } return nready; }
std::vector<epoll::event> epoll::await(std::uint32_t chunk_size) const { std::vector<epoll_event> active_files; active_files.resize(chunk_size); auto events_number = epoll_wait(efd_, &active_files.front(), chunk_size, 1000); if (-1 == events_number) { active_files.resize(0); if (errno != EINTR) throw poll_error("Could not poll for events. errno = " + std::to_string(errno)); } else { active_files.resize(events_number); } return create_events(active_files); }
void epoll::remove(const io::channel *context) { auto event_it = std::find_if(events_.begin(), events_.end(), [context](epoll_event &ev) { return (context == ev.data.ptr); }); if (event_it != events_.end()) { auto *event = std::addressof(*event_it); if (-1 == epoll_ctl(efd_, EPOLL_CTL_DEL, context->socket->get_fd(), event)) throw poll_error("Could not remove the file with fd = " + std::to_string(context->socket->get_fd()) + " from the OS queue"); events_.erase(std::remove_if(events_.begin(), events_.end(), [&event_it](auto &ev) { return ev.data.fd == event_it->data.fd; }), events_.end()); } else { // WTF? } }