diff --git a/a8/eventfd.cc b/a8/eventfd.cc index 62a8747..c0dd8cb 100644 --- a/a8/eventfd.cc +++ b/a8/eventfd.cc @@ -1,5 +1,8 @@ #include +#include +#include + #include #include @@ -18,8 +21,7 @@ namespace a8 EventFD::~EventFD() { - ::close(fd_); - fd_ = a8::INVALID_FD; + UnInit(); } void EventFD::Init(void* context) @@ -27,13 +29,30 @@ namespace a8 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) { - eventfd_write(fd_, value); + ::eventfd_write(fd_, value); } 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; } diff --git a/a8/eventfd.h b/a8/eventfd.h index e3a7ea6..c33eb10 100644 --- a/a8/eventfd.h +++ b/a8/eventfd.h @@ -14,6 +14,7 @@ namespace a8 virtual ~EventFD(); void Init(void* context); + void UnInit(); void Write(unsigned long long value); virtual void SetEpollFd(int epoll_fd) override; virtual void DoRecv() override; diff --git a/a8/timerfd.cc b/a8/timerfd.cc index 6aab2ce..c69d332 100644 --- a/a8/timerfd.cc +++ b/a8/timerfd.cc @@ -1,5 +1,6 @@ #include +#include #include #include @@ -18,8 +19,7 @@ namespace a8 TimerFD::~TimerFD() { - ::close(fd_); - fd_ = a8::INVALID_FD; + UnInit(); } void TimerFD::Init(void* context) @@ -27,6 +27,16 @@ namespace a8 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) { itimerspec new_value; @@ -59,6 +69,13 @@ namespace a8 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; } diff --git a/a8/timerfd.h b/a8/timerfd.h index 5677b1e..a68d684 100644 --- a/a8/timerfd.h +++ b/a8/timerfd.h @@ -14,6 +14,7 @@ namespace a8 virtual ~TimerFD(); void Init(void* context); + void UnInit(); void Start(long long ms); void Stop(); virtual void SetEpollFd(int epoll_fd) override;