# include <sys/epoll.h>
# include <sys/eventfd.h>
// 1. 启动时,在epollFd_上添加awakenFd监听
if (epollFd_ < 0) {
epollFd_= epoll_create1(EPOLL_CLOEXEC);
}
if (awakenFd_< 0) {
awakenFd_ = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK);
if (awakenFd_ < 0) {
std::cerr << "Failed to create awakenFd\n";
return;
}
}
struct epoll_event epollEvent = {
.events = EPOLLIN | EPOLLET,
.data = {.fd = awakenFd_},
};
epoll_ctl(epollFd_, EPOLL_CTL_ADD, awakenFd_, &epollEvent);
// 2. 关闭时(ShutDown),write sth.
static const uint64_t incre = 1;
write(awakenFd_, &incre, sizeof(incre));
// 3. 在定时器的阻塞线程中epoll_wait收到write事件时将会返回
std::vector<struct epoll_event> epollEvents(maxEvents_);
int nfd = epool_wait(epollFd_, &epollEvents[0], static_cast<int>(epollEvents.size()), timeout);
for (int index = 0; index < nfd; ++index) {
if (epollEvents[index].data.fd == awakenFd_) {
uint64_t value = 0;
read(awakenFd_, &value, sizeof(value));
continue;
}
// process other common event
}
if (nfd == maxEvents_) {
// 对maxEvents_扩容,初始值可能是8等。。
maxEvents_ *= 2;
}
// 4. 清理该定时器时,同时清理awakenFd
if (awakenFd_> 0) {
close(awakenFd_);
awakenFd_ = -1;
}