void * epoll_thread(void * param) { SyncHandler * pSync = (SyncHandler *) param; printf("--->epoll_thread:0x%x\n", pthread_self()); pSync->m_epoll = epoll_create(SOCKET_HOLDER_SIZE); if (pSync->m_epoll == -1) { printf ("Could not create epoll fd (/dev/epoll)."); pthread_exit(0); } struct epoll_event * events = new struct epoll_event[SOCKET_HOLDER_SIZE]; while( !pSync->m_bShutdown ) { int fd_count = epoll_wait(pSync->m_epoll, events, SOCKET_HOLDER_SIZE, 5000); for ( int i = 0; i < fd_count; i++ ) { //printf("\n==================== epoll_thread ============\n"); Session * pSession = (Session *) events[i].data.ptr; if ( (events[i].events & EPOLLHUP) || (events[i].events & EPOLLERR) ) { pSession->Remove(); continue; } if ( events[i].events & EPOLLOUT ) { //printf("pSession->OnSend()\n"); pSession->OnSend(); pSync->ModEpollEvent(pSession, EPOLLIN | EPOLLET | EPOLLERR | EPOLLHUP); } if ( events[i].events & EPOLLIN ) { //printf("\n*********** EPOLLIN ************* \n"); pSync->AddIoEvent(&events[i]); } } } delete [] events; printf ("epoll_thread 0x%x exit \n ", pthread_self() ); pthread_exit(0); }