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); } }
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; } }