void TimerQueue::handleRead() { loop_->assertInLoopThread(); Timestamp now(Timestamp::now()); readTimerfd(timerfd_, now); std::vector<Entry> expired = getExpired(now); callingExpiredTimers_ = true; cancelingTimers_.clear(); // safe to callback outside critical section for (std::vector<Entry>::iterator it = expired.begin(); it != expired.end(); ++it) { it->second->run(); } callingExpiredTimers_ = false; reset(expired, now); }
/* struct pollfd { int fd; // file descriptor short events; // requested events short revents; // returned events }; */ void Timer::start() { setTimerfd(timerfd_, val_, interval_); isStarted_ = true; struct pollfd pfd; pfd.fd = timerfd_; pfd.events = POLLIN; // 监听输入事件 uint64_t val; int ret; while(isStarted_) { ret = ::poll(&pfd, 1, 5000); // 可以认为pfd是大小为1的数组 if(ret == -1) { if(errno == EINTR) { continue; // 出错情况为遇到中断信号,继续poll } ERR_EXIT("poll"); } else if (ret == 0) // 超时 { printf("timeout \n"); } else { if (pfd.revents == POLLIN) // 判断此fd是否是监听的read事件(这边较为严禁,实际上只监听一个描述符是可以不加这条判断语句) { readTimerfd(timerfd_); // 取走timerfd_的字节 callback_(); // 用户逻辑 } } } }