#include "stdafx.h"
#include "Epoll.h"
#include <unistd.h>
CEpoll::CEpoll(void)
{
m_epollfd = -1;
}
CEpoll::~CEpoll(void)
{
}
int CEpoll::Init()
{
Create(10000);
return 0;
}
int CEpoll::Release()
{
if( -1 != m_epollfd )
{
close(m_epollfd);
}
}
int CEpoll::Create(int size)
{
return m_epollfd = epoll_create(size);
}
int CEpoll::Ctl( void* p, int op,int fd, int events)
{
struct epoll_event e;
e.data.ptr = p;
e.events = events;
return epoll_ctl(m_epollfd, op, fd, &e);
}
void CEpoll::AddItem(CISocket* item)
{
m_waitList.push_back(item);
Ctl((void*)item,EPOLL_CTL_ADD,item->GetFd(),EPOLLIN | EPOLLERR);
}
void CEpoll::EpollWait()
{
int timeout = 100;
for(std::list<CISocket*>::iterator it = m_waitList.begin();it!= m_waitList.end();it++)
{
if( !(*it)->IsValid() || (*it)->NeedDel() )
{
Ctl((void*)(*it),EPOLL_CTL_DEL,(*it)->GetFd(),(int)(*it)->GetNewEvent());
it = m_waitList.erase(it);
continue;
}
(*it)->Work();
if((*it)->GetNewEvent() != (*it)->GetOldEvent())
{
Ctl((void*)(*it),EPOLL_CTL_MOD,(*it)->GetFd(),(int)(*it)->GetNewEvent());
(*it)->SaveNewEvent();
}
}
int count = epoll_wait(m_epollfd, m_events, 10000, timeout);
for(int i=0;i<count;i++)
{
char e = (char) m_events[i].events;
CISocket* socket = (CISocket*) m_events[i].data.ptr;
if( e & EPOLLIN | e & (char)16)
{
socket->Read();
}
if( e & EPOLLOUT )
{
socket->Write();
}
if( e & EPOLLERR )
{
socket->SetValid(false);
}
}
}