58 lines
1.5 KiB
C++
58 lines
1.5 KiB
C++
#include <a8/a8.h>
|
|
|
|
#include <memory.h>
|
|
#include <unistd.h>
|
|
|
|
#include <arpa/inet.h>
|
|
#include <fcntl.h>
|
|
#include <sys/epoll.h>
|
|
#include <netinet/tcp.h>
|
|
|
|
#include <thread>
|
|
|
|
#include <a8/ioloop.h>
|
|
#include <a8/tcpclient2.h>
|
|
|
|
namespace a8
|
|
{
|
|
|
|
void IoLoop::Init()
|
|
{
|
|
max_client_num_ = 10000;
|
|
epoll_fd = ::epoll_create(max_client_num_);
|
|
assert(epoll_fd != a8::INVALID_FD);
|
|
worker_thread_ = new std::thread(&a8::IoLoop::WorkerThreadProc, this);
|
|
}
|
|
|
|
void IoLoop::UnInit()
|
|
{
|
|
::close(epoll_fd);
|
|
epoll_fd = a8::INVALID_FD;
|
|
delete worker_thread_;
|
|
worker_thread_ = nullptr;
|
|
}
|
|
|
|
void IoLoop::WorkerThreadProc()
|
|
{
|
|
epoll_event *events = new epoll_event[max_client_num_];
|
|
while (!worker_thread_shutdown_) {
|
|
int nfds = ::epoll_wait(epoll_fd, events, max_client_num_, 1000 * 10);
|
|
for (int i = 0; i < nfds; ++i) {
|
|
a8::TcpClient2* session = (a8::TcpClient2*)events[i].data.ptr;
|
|
if (events[i].events & EPOLLOUT) {
|
|
session->DoSend();
|
|
} else if (events[i].events & EPOLLIN) {
|
|
session->DoRecv();
|
|
} else if (events[i].events & EPOLLRDHUP ||
|
|
events[i].events & EPOLLHUP ||
|
|
events[i].events & EPOLLERR
|
|
) {
|
|
session->DoDisConnect();
|
|
}
|
|
}
|
|
}
|
|
delete [] events;
|
|
}
|
|
|
|
}
|