This commit is contained in:
aozhiwei 2020-01-09 16:17:52 +08:00
parent 28ec90a305
commit e899665c7d
4 changed files with 43 additions and 5 deletions

View File

@ -1,5 +1,8 @@
#include <unistd.h> #include <unistd.h>
#include <fcntl.h>
#include <sys/epoll.h>
#include <sys/eventfd.h> #include <sys/eventfd.h>
#include <a8/a8.h> #include <a8/a8.h>
@ -18,8 +21,7 @@ namespace a8
EventFD::~EventFD() EventFD::~EventFD()
{ {
::close(fd_); UnInit();
fd_ = a8::INVALID_FD;
} }
void EventFD::Init(void* context) void EventFD::Init(void* context)
@ -27,13 +29,30 @@ namespace a8
context_ = context; context_ = context;
} }
void EventFD::UnInit()
{
if (fd_ != a8::INVALID_FD) {
struct epoll_event ev;
::epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, fd_, &ev);
::close(fd_);
fd_ = a8::INVALID_FD;
}
}
void EventFD::Write(unsigned long long value) void EventFD::Write(unsigned long long value)
{ {
eventfd_write(fd_, value); ::eventfd_write(fd_, value);
} }
void EventFD::SetEpollFd(int epoll_fd) void EventFD::SetEpollFd(int epoll_fd)
{ {
struct epoll_event ev;
ev.data.fd = fd_;
ev.events = EPOLLIN | EPOLLET;
int ret = ::epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd_, &ev);
if (ret != 0) {
abort();
}
epoll_fd_ = epoll_fd; epoll_fd_ = epoll_fd;
} }

View File

@ -14,6 +14,7 @@ namespace a8
virtual ~EventFD(); virtual ~EventFD();
void Init(void* context); void Init(void* context);
void UnInit();
void Write(unsigned long long value); void Write(unsigned long long value);
virtual void SetEpollFd(int epoll_fd) override; virtual void SetEpollFd(int epoll_fd) override;
virtual void DoRecv() override; virtual void DoRecv() override;

View File

@ -1,5 +1,6 @@
#include <unistd.h> #include <unistd.h>
#include <sys/epoll.h>
#include <sys/timerfd.h> #include <sys/timerfd.h>
#include <a8/a8.h> #include <a8/a8.h>
@ -18,8 +19,7 @@ namespace a8
TimerFD::~TimerFD() TimerFD::~TimerFD()
{ {
::close(fd_); UnInit();
fd_ = a8::INVALID_FD;
} }
void TimerFD::Init(void* context) void TimerFD::Init(void* context)
@ -27,6 +27,16 @@ namespace a8
context_ = context; context_ = context;
} }
void TimerFD::UnInit()
{
if (fd_ != a8::INVALID_FD) {
struct epoll_event ev;
::epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, fd_, &ev);
::close(fd_);
fd_ = a8::INVALID_FD;
}
}
void TimerFD::Start(long long ms) void TimerFD::Start(long long ms)
{ {
itimerspec new_value; itimerspec new_value;
@ -59,6 +69,13 @@ namespace a8
void TimerFD::SetEpollFd(int epoll_fd) void TimerFD::SetEpollFd(int epoll_fd)
{ {
struct epoll_event ev;
ev.data.fd = fd_;
ev.events = EPOLLIN | EPOLLET;
int ret = ::epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd_, &ev);
if (ret != 0) {
abort();
}
epoll_fd_ = epoll_fd; epoll_fd_ = epoll_fd;
} }

View File

@ -14,6 +14,7 @@ namespace a8
virtual ~TimerFD(); virtual ~TimerFD();
void Init(void* context); void Init(void* context);
void UnInit();
void Start(long long ms); void Start(long long ms);
void Stop(); void Stop();
virtual void SetEpollFd(int epoll_fd) override; virtual void SetEpollFd(int epoll_fd) override;