示例#1
0
void SelectManager::initFdSet()
{
    int fd;
    int event;
    EventHandler *handler;
    EventMap::const_iterator iter;

    FD_ZERO(&m_readSet);
    FD_ZERO(&m_writeSet);
    FD_SET(m_recvNotifyFd, &m_readSet);
    for (iter = m_eventMap.begin(); iter != m_eventMap.end(); ++iter)
    {
        fd = iter->first;
        handler = iter->second;
        event = handler->getRegisterEvent();

        if (READ & event) FD_SET(fd, &m_readSet);
        if (WRITE & event) FD_SET(fd, &m_writeSet);
    }
}
示例#2
0
void SelectManager::handleFdSet()
{
    int fd;
    int hasEvent;
    EventHandler *handler;
    EventMap::const_iterator iter;

    for (iter = m_eventMap.begin(); iter != m_eventMap.end(); )
    {
        hasEvent = 0;
        fd = iter->first;
        handler = iter->second;
        if (handler->getRegisterEvent() == NONE)
        {
            LockGuard<SpinLock> guard(m_lock);
            if (handler->dec() == 0) delete handler;
            iter = m_eventMap.erase(iter);

            continue;
        }

        if (!handler->hasRead() && FD_ISSET(fd, &m_readSet))
        {
            hasEvent = 1;
            handler->activateRead();
        }
        if (!handler->hasWrite() && FD_ISSET(fd, &m_writeSet))
        {
            hasEvent = 1;
            handler->activateWrite();
        }

        if (hasEvent) handleEvent(handler);
        ++iter;
    }
}