Beispiel #1
0
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;
}
Beispiel #2
0
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);
}
Beispiel #3
0
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?
    }
}