blob: 3c4ddf3836ea4e82328b946166ec52c1766a9d02 [file]
/**
* Copyright (C) 2013 suwenkuang ,hooligan_520@qq.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "Epoller.h"
#include <unistd.h>
namespace kpr
{
Epoller::Epoller(bool bEt)
{
_iEpollfd = -1;
_pevs = NULL;
_et = bEt;
_max_connections = 1024;
}
Epoller::~Epoller()
{
if (_pevs != NULL)
{
delete[] _pevs;
_pevs = NULL;
}
if (_iEpollfd > 0)
{
close(_iEpollfd);
}
}
void Epoller::ctrl(int fd, long long data, __uint32_t events, int op)
{
struct epoll_event ev;
ev.data.u64 = data;
if (_et)
{
ev.events = events | EPOLLET;
}
else
{
ev.events = events;
}
epoll_ctl(_iEpollfd, op, fd, &ev);
}
void Epoller::create(int max_connections)
{
_max_connections = max_connections;
_iEpollfd = epoll_create(_max_connections + 1);
if (_pevs != NULL)
{
delete[] _pevs;
}
_pevs = new epoll_event[_max_connections + 1];
}
void Epoller::add(int fd, long long data, __uint32_t event)
{
ctrl(fd, data, event, EPOLL_CTL_ADD);
}
void Epoller::mod(int fd, long long data, __uint32_t event)
{
ctrl(fd, data, event, EPOLL_CTL_MOD);
}
void Epoller::del(int fd, long long data, __uint32_t event)
{
ctrl(fd, data, event, EPOLL_CTL_DEL);
}
int Epoller::wait(int millsecond)
{
return epoll_wait(_iEpollfd, _pevs, _max_connections + 1, millsecond);
}
}