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]