Timer * TimerQueue::Pop(std::chrono::steady_clock::time_point now) noexcept { auto t = timers.begin(); if (t != timers.end() && t->IsDue(now)) { Timer *timer = t->timer; timers.erase(t); return timer; } else return nullptr; }
Timer * TimerQueue::Pop(uint64_t now_us) { Timer *timer = nullptr; auto t = timers.begin(); if (t != timers.end() && t->IsDue(now_us)) { timer = t->timer; if (timer->IsActive()) { /* not cancelled by another thread */ Add(*timer, t->due_us + timer->GetPeriod()*1000); } else { timer = nullptr; } timers.erase(t); } return timer; }