Timestamp EpollPoller::pollOnce(int timeoutMs, ChannelList& activeChannels) { int numEvents = ::epoll_wait(epollfd_, &*events_.begin(), static_cast<int>(events_.size()), timeoutMs); int savedErrno = errno; Timestamp now(Timestamp::now()); if (numEvents > 0) { LOG_INFO("EpollPoller::pollOnce: [%d] events happended", numEvents); fireActiveChannels(numEvents, activeChannels); if (static_cast<size_t>(numEvents) == events_.size()) { events_.resize(events_.size()*2); } } else if (numEvents == 0) { LOG_INFO("EpollPoller::pollOnce: nothing happended"); } else { // error happens, log uncommon ones // TODO : should return -1 if EINTR, else return 0 if (savedErrno != SOCK_ERR_EINTR) { errno = savedErrno; LOG_INFO("EpollPoller::pollOnce: error [%d]", savedErrno); } } return now; }
int FdEventsKqueuer::poll(std::vector<FdEvent *>& fdevents, int timeoutMs) { struct timespec stimespec; if (timeoutMs > 0) { stimespec.tv_sec = timeval / 1000; stimespec.tv_nsec = (timeval % 1000) * 1000000; } int numEvents = ::kevent(kqueuefd_, NULL, 0, &*events_.begin(), static_cast<int>(events_.size()), timeoutMs > 0 ? &stimespec : 0); int savedErrno = errno; if (numEvents > 0) { printf("FdEventsKqueuer::poll: [%d] events happended\n", numEvents); fireActiveChannels(numEvents, fdevents); if (static_cast<size_t>(numEvents) == events_.size()) { events_.resize(events_.size() * 2); } } else if (numEvents == 0) { printf("FdEventsKqueuer::poll: nothing happended\n"); return 0; } else // error happens { // TODO : should return -1 if EINTR, else return 0 if (savedErrno != EINTR) { errno = savedErrno; printf("FdEventsKqueuer::poll: error [%d]\n", savedErrno); } return -1; } return numEvents; }
Timestamp PollPoller::poll_once(int timeoutMs, ChannelList& activeChannels) { int numEvents = ::poll(&*pollfds_.begin(), pollfds_.size(), timeoutMs); int savedErrno = errno; Timestamp now(Timestamp::now()); if (numEvents > 0) { fireActiveChannels(numEvents, activeChannels); } else if (numEvents == 0) { LOG_INFO("PollPoller::poll_once: nothing happended"); } else { if (savedErrno != SOCK_ERR_EINTR) { errno = savedErrno; LOG_INFO("EpollPoller::poll_once: error [%d]", errno); } } return now; }