Example #1
0
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);
}
Example #2
0
/*
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_();           // 用户逻辑              
            }
        }
    }
}