diff options
author | Liav A <liavalb@gmail.com> | 2022-10-10 17:36:18 +0300 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2022-10-14 14:13:51 +0200 |
commit | 7520acd4ebd1f3c74b1f19c2cfba63d8a75a0a9c (patch) | |
tree | bfc1b68800ae67d6a50fac9a4f020cd8fd01a966 /Kernel/Time | |
parent | 3651d9701e2a91b5c13012bdd3fbcf333ae2369a (diff) | |
download | serenity-7520acd4ebd1f3c74b1f19c2cfba63d8a75a0a9c.zip |
Kernel: Move Scheduler current time method to the TimeManagement code
Diffstat (limited to 'Kernel/Time')
-rw-r--r-- | Kernel/Time/TimeManagement.cpp | 22 | ||||
-rw-r--r-- | Kernel/Time/TimeManagement.h | 2 |
2 files changed, 24 insertions, 0 deletions
diff --git a/Kernel/Time/TimeManagement.cpp b/Kernel/Time/TimeManagement.cpp index 4bf25c7e20..99318a918e 100644 --- a/Kernel/Time/TimeManagement.cpp +++ b/Kernel/Time/TimeManagement.cpp @@ -17,6 +17,7 @@ # include <Kernel/Arch/x86/common/Interrupts/APIC.h> # include <Kernel/Arch/x86/common/RTC.h> #endif +#include <Kernel/Arch/CurrentTime.h> #include <Kernel/CommandLine.h> #include <Kernel/Firmware/ACPI/Parser.h> #include <Kernel/PerformanceManager.h> @@ -40,6 +41,22 @@ TimeManagement& TimeManagement::the() return *s_the; } +// The s_scheduler_specific_current_time function provides a current time for scheduling purposes, +// which may not necessarily relate to wall time +static u64 (*s_scheduler_current_time)(); + +static u64 current_time_monotonic() +{ + // We always need a precise timestamp here, we cannot rely on a coarse timestamp + return (u64)TimeManagement::the().monotonic_time(TimePrecision::Precise).to_nanoseconds(); +} + +u64 TimeManagement::scheduler_current_time() +{ + VERIFY(s_scheduler_current_time); + return s_scheduler_current_time(); +} + ErrorOr<void> TimeManagement::validate_clock_id(clockid_t clock_id) { switch (clock_id) { @@ -163,6 +180,11 @@ UNMAP_AFTER_INIT void TimeManagement::initialize([[maybe_unused]] u32 cpu) apic_timer->enable_local_timer(); } } + auto* possible_arch_specific_current_time_function = optional_current_time(); + if (possible_arch_specific_current_time_function) + s_scheduler_current_time = possible_arch_specific_current_time_function; + else + s_scheduler_current_time = current_time_monotonic; #endif } diff --git a/Kernel/Time/TimeManagement.h b/Kernel/Time/TimeManagement.h index d2973f6f86..f5e20d0f66 100644 --- a/Kernel/Time/TimeManagement.h +++ b/Kernel/Time/TimeManagement.h @@ -37,6 +37,8 @@ public: static bool is_initialized(); static TimeManagement& the(); + static u64 scheduler_current_time(); + static ErrorOr<void> validate_clock_id(clockid_t); Time current_time(clockid_t) const; Time monotonic_time(TimePrecision = TimePrecision::Coarse) const; |