Exemple #1
0
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;
}