Unify steady and system clock

This commit is contained in:
Maurice Heumann
2025-03-18 12:10:59 +01:00
parent 450e3c2a9c
commit 2cc2137c3a
12 changed files with 83 additions and 100 deletions

View File

@@ -10,27 +10,35 @@ constexpr auto WINDOWS_EPOCH_DIFFERENCE = EPOCH_DIFFERENCE_1601_TO_1970_SECONDS
namespace utils
{
template <typename Clock>
struct clock
{
using base_clock = Clock;
using time_point = typename base_clock::time_point;
using duration = typename base_clock::duration;
using system_time_point = std::chrono::system_clock::time_point;
using steady_time_point = std::chrono::steady_clock::time_point;
using system_duration = system_time_point::duration;
using steady_duration = steady_time_point::duration;
virtual ~clock() = default;
virtual time_point now()
virtual system_time_point system_now()
{
return base_clock::now();
return std::chrono::system_clock::now();
}
virtual steady_time_point steady_now()
{
return std::chrono::steady_clock::now();
}
};
template <typename Clock>
class tick_clock : public clock<Clock>
class tick_clock : public clock
{
public:
tick_clock(const typename tick_clock::time_point start, const uint64_t frequency)
tick_clock(const uint64_t frequency = 1, const system_time_point system_start = {},
const steady_time_point steady_start = {})
: frequency_(frequency),
start_(start)
system_start_(system_start),
steady_start_(steady_start)
{
if (this->frequency_ == 0)
{
@@ -38,13 +46,14 @@ namespace utils
}
}
typename tick_clock::time_point now() override
system_time_point system_now() override
{
const auto passed_ticks = this->ticks();
const auto passed_time =
tick_clock::duration(passed_ticks * tick_clock::duration::period::den / this->frequency_);
return this->now(this->system_start_);
}
return this->start_ + passed_time;
steady_time_point steady_now() override
{
return this->now(this->steady_start_);
}
virtual uint64_t ticks() = 0;
@@ -56,15 +65,22 @@ namespace utils
private:
uint64_t frequency_{1};
typename tick_clock::time_point start_{};
system_time_point system_start_{};
steady_time_point steady_start_{};
template <typename TimePoint>
TimePoint now(const TimePoint start)
{
using duration = typename TimePoint::duration;
const auto passed_ticks = this->ticks();
const auto passed_time = duration(passed_ticks * duration::period::den / this->frequency_);
return start + passed_time;
}
};
using system_clock = clock<std::chrono::system_clock>;
using steady_clock = clock<std::chrono::steady_clock>;
std::chrono::steady_clock::time_point convert_delay_interval_to_time_point(steady_clock& steady_time,
system_clock& system_time,
LARGE_INTEGER delay_interval);
std::chrono::steady_clock::time_point convert_delay_interval_to_time_point(clock& c, LARGE_INTEGER delay_interval);
KSYSTEM_TIME convert_to_ksystem_time(const std::chrono::system_clock::time_point& tp);
void convert_to_ksystem_time(volatile KSYSTEM_TIME* dest, const std::chrono::system_clock::time_point& tp);