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