long long CoTimerMgr::GetExpired(std::list<CoTimerPtr> &result, uint32_t n) { std::unique_lock<LFLock> lock(lock_, std::defer_lock); if (!lock.try_lock()) return GetNextTriggerTime(); TimePoint now = Now(); auto it = deadlines_.begin(); for (; it != deadlines_.end() && n > 0; --n, ++it) { if (it->first > now) { break; } result.push_back(it->second); } if (it != deadlines_.end()) { // 还有timer需要触发 TimePoint const& next_tp = it->first; SetNextTriggerTime(next_tp); } else next_trigger_time_ = std::numeric_limits<long>::max(); deadlines_.erase(deadlines_.begin(), it); return GetNextTriggerTime(); }
long long CoTimerMgr::GetExpired(std::list<CoTimerPtr> &result, uint32_t n) { if (system_deadlines_.empty() && steady_deadlines_.empty()) return std::numeric_limits<long long>::max(); std::unique_lock<LFLock> lock(lock_, std::defer_lock); if (!lock.try_lock()) return GetNextTriggerTime(); { SystemTimePoint now = SystemNow(); auto it = system_deadlines_.begin(); for (; it != system_deadlines_.end() && n > 0; --n, ++it) { if (it->first > now) { break; } it->second->token_state_ = CoTimer::e_token_state::none; result.push_back(it->second); } if (it != system_deadlines_.end()) SetNextTriggerTime(it->first); else system_next_trigger_time_ = std::numeric_limits<long long>::max(); system_deadlines_.erase(system_deadlines_.begin(), it); } { SteadyTimePoint now = SteadyNow(); auto it = steady_deadlines_.begin(); for (; it != steady_deadlines_.end() && n > 0; --n, ++it) { if (it->first > now) { break; } it->second->token_state_ = CoTimer::e_token_state::none; result.push_back(it->second); } if (it != steady_deadlines_.end()) SetNextTriggerTime(it->first); else steady_next_trigger_time_ = std::numeric_limits<long long>::max(); steady_deadlines_.erase(steady_deadlines_.begin(), it); } return GetNextTriggerTime(); }