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