白森 发表于 2015-9-10 07:38:03

Ceph剖析:定时器safetimer的实现

void SafeTimer::timer_thread()  {
  lock.Lock();
  while (!stopping) {
  utime_t now = ceph_clock_now(cct); /// 获取当前时间
  
  while (!schedule.empty()) {
  scheduled_map_t::iterator p = schedule.begin();
  
  /// 还没达到指定的定时时间
  /// 因为schedule中的定时项是已经排好顺序的,第1个元素就是最先要处理的事件,所以只要检查第1个元素就可以了
  if (p->first > now) {
  break;
  }
  
  /// 处理指定的事件
  Context *callback = p->second;
  events.erase(callback);
  schedule.erase(p);
  
  if (!safe_callbacks){
  lock.Unlock();
  }
  
  /// 处理事件时,解锁。因为处理事件不会修改定时器本身的数据
  callback->complete(0);
  if (!safe_callbacks){
  lock.Lock();
  }
  }
  
  /// 当使用者向schedule插入新的定时项时,如果新的定时项的时间是最早的,那么它会唤醒该线程
  if (schedule.empty()) {
  cond.Wait(lock);
  } else {
  /// 等待指定的时间
  cond.WaitUntil(lock, schedule.begin()->first);
  }
  }
  lock.Unlock();
  }
页: [1]
查看完整版本: Ceph剖析:定时器safetimer的实现