s64 epoller::DealEvent(s64 overtime) { s64 lTick = tools::GetTimeMillisecond(); epoll_event events[EPOLLER_EVENTS_COUNT]; memset(&events, 0, sizeof(events)); errno = 0; int retCount = epoll_wait(m_lEpollFD, events, EPOLLER_EVENTS_COUNT, 5); if (retCount == -1) { TASSERT(errno == EINTR, "epoll_wait err! %s", strerror(errno)); return tools::GetTimeMillisecond() - lTick; } for (s32 i=0; i<retCount; i++) { epollerEvent * pEvent = (epollerEvent *)events[i].data.ptr; switch (pEvent->type) { case SO_ACCEPT: { SPipe * pSPipe = (SPipe *)pEvent->pData; if (events[i].events & (EPOLLERR | EPOLLHUP | EPOLLRDHUP)) { pSPipe->GetHost()->Error(Kernel::getInstance(), NULL); } else if (events[i].events & EPOLLIN) { pSPipe->DoAccept(); } break; } case SO_CONNECT: { CPipe * pCPipe = (CPipe *)pEvent->pData; if (events[i].events & (EPOLLERR | EPOLLHUP | EPOLLRDHUP)) { pCPipe->GetHost()->OnConnectFailed(Kernel::getInstance()); pCPipe->GetHost()->m_pPipe = NULL; pCPipe->Release(); } else if (events[i].events & EPOLLOUT) { pCPipe->DoConnect(); } break; } default: TASSERT(false, "wtf"); break; } } return tools::GetTimeMillisecond() - lTick; }