sled/src/timer/timer.cc

61 lines
1.5 KiB
C++
Raw Normal View History

2024-03-07 21:10:13 +08:00
#include "sled/timer/timer.h"
namespace sled {
namespace {
TimeoutID
MakeTimeoutId(TimerID timer_id, TimerGeneration generation)
{
return TimeoutID(static_cast<uint64_t>((timer_id << 32) | generation));
}
}// namespace
Timer::Timer(TimerID id,
const std::string &name,
OnExpired on_expired,
UnregisterHandler unregister_handler,
std::unique_ptr<Timeout> timeout)
: id_(id),
name_(name),
on_expired_(on_expired),
unregister_handler_(unregister_handler),
timeout_(std::move(timeout))
{}
Timer::~Timer()
{
Stop();
unregister_handler_();
}
void
Timer::Start()
{
expiration_count_ = 0;
if (!is_running()) {
is_running_ = true;
generation_ = TimerGeneration(generation_ + 1);
timeout_->Start(duration_, MakeTimeoutId(id_, generation_));
} else {
generation_ = TimerGeneration(generation_ + 1);
timeout_->Restart(duration_, MakeTimeoutId(id_, generation_));
}
}
std::unique_ptr<Timer>
TimerManager::CreateTimer(const std::string &name, Timer::OnExpired on_expired)
{
next_id_ = TimerID(next_id_ + 1);
TimerID id = next_id_;
std::unique_ptr<Timeout> timeout =
timeout_creator_(sled::TaskQueueBase::DelayPrecision::kHigh);
auto timer = std::unique_ptr<Timer>(new Timer(
id, name, std::move(on_expired),
/* ungrgister_handler=*/[this, id]() { timers_.erase(id); },
std::move(timeout)));
timers_[id] = timer.get();
return timer;
}
}// namespace sled