Exemplo n.º 1
0
int32_t CEpoll::HandleMessage(int32_t nWaitTimeout)
{
	if(m_nEpollFD <= 0)
	{
		Delay(10000);
		return -1;
	}

	int32_t nEventCount = epoll_wait(m_nEpollFD, m_pEpollEvent, m_nMaxFD, nWaitTimeout);
	if(nEventCount < 0)
	{
		return -1;
	}

	for(int32_t i = 0; i < nEventCount; ++i)
	{
		CSocket *pSocket = (CSocket *)m_pEpollEvent[i].data.ptr;
		if(pSocket == NULL)
		{
			continue;
		}

		SessionStatus nSessionStatus = pSocket->GetSessionStatus();
		if((nSessionStatus == enmSessionStatus_Closed) || (nSessionStatus == enmSessionStatus_Error))
		{
			continue;
		}

		if((m_pEpollEvent[i].events & EPOLLIN) != 0)
		{
			pSocket->ReadEvent();

			SessionStatus nSessionStatus = pSocket->GetSessionStatus();
			if((nSessionStatus == enmSessionStatus_Closed) || (nSessionStatus == enmSessionStatus_Error))
			{
				continue;
			}
		}
		if((m_pEpollEvent[i].events & EPOLLOUT) != 0)
		{
			pSocket->WriteEvent();

			SessionStatus nSessionStatus = pSocket->GetSessionStatus();
			if((nSessionStatus == enmSessionStatus_Closed) || (nSessionStatus == enmSessionStatus_Error))
			{
				continue;
			}
		}
		if((m_pEpollEvent[i].events & EPOLLERR) != 0)
		{
			pSocket->ErrorEvent();

			SessionStatus nSessionStatus = pSocket->GetSessionStatus();
			if((nSessionStatus == enmSessionStatus_Closed) || (nSessionStatus == enmSessionStatus_Error))
			{
				continue;
			}
		}
		if((m_pEpollEvent[i].events & EPOLLHUP) != 0)
		{
			pSocket->ErrorEvent();

			SessionStatus nSessionStatus = pSocket->GetSessionStatus();
			if((nSessionStatus == enmSessionStatus_Closed) || (nSessionStatus == enmSessionStatus_Error))
			{
				continue;
			}
		}
//		if(!(m_pEpollEvent[i].events & EPOLLIN) &&
//				!(m_pEpollEvent[i].events & EPOLLOUT) &&
//				!(m_pEpollEvent[i].events & EPOLLERR) &&
//				!(m_pEpollEvent[i].events & EPOLLHUP))
//		{
//			g_FrameLogEngine.WriteNetioLog(enmLogLevel_Error, "it's not found ioevent = 0x%08x\n", m_pEpollEvent[i].events);
//		}
	}

	return nEventCount;
}