diff options
Diffstat (limited to 'Kernel')
-rw-r--r-- | Kernel/TimerQueue.cpp | 12 | ||||
-rw-r--r-- | Kernel/TimerQueue.h | 14 |
2 files changed, 16 insertions, 10 deletions
diff --git a/Kernel/TimerQueue.cpp b/Kernel/TimerQueue.cpp index 0e2add6a3f..4222102b42 100644 --- a/Kernel/TimerQueue.cpp +++ b/Kernel/TimerQueue.cpp @@ -28,6 +28,7 @@ #include <AK/NonnullOwnPtr.h> #include <AK/OwnPtr.h> #include <Kernel/Scheduler.h> +#include <Kernel/Time/TimeManagement.h> #include <Kernel/TimerQueue.h> namespace Kernel { @@ -41,9 +42,14 @@ TimerQueue& TimerQueue::the() return *s_the; } +TimerQueue::TimerQueue() +{ + m_ticks_per_second = TimeManagement::the().ticks_per_second(); +} + u64 TimerQueue::add_timer(NonnullOwnPtr<Timer>&& timer) { - ASSERT(timer->expires > g_uptime); + ASSERT(timer->expires >= g_uptime); timer->id = ++m_timer_id_count; @@ -58,10 +64,10 @@ u64 TimerQueue::add_timer(NonnullOwnPtr<Timer>&& timer) return m_timer_id_count; } -u64 TimerQueue::add_timer(u64 duration, TimeUnit unit, Function<void()>&& callback) +u64 TimerQueue::add_timer(timeval& deadline, Function<void()>&& callback) { NonnullOwnPtr timer = make<Timer>(); - timer->expires = g_uptime + duration * unit; + timer->expires = g_uptime + seconds_to_ticks(deadline.tv_sec) + microseconds_to_ticks(deadline.tv_usec); timer->callback = move(callback); return add_timer(move(timer)); } diff --git a/Kernel/TimerQueue.h b/Kernel/TimerQueue.h index 4398a71448..d0fd9d0381 100644 --- a/Kernel/TimerQueue.h +++ b/Kernel/TimerQueue.h @@ -52,26 +52,26 @@ struct Timer { } }; -enum TimeUnit { - MS = OPTIMAL_TICKS_PER_SECOND_RATE / 1000, - S = OPTIMAL_TICKS_PER_SECOND_RATE, - M = OPTIMAL_TICKS_PER_SECOND_RATE * 60 -}; - class TimerQueue { public: static TimerQueue& the(); u64 add_timer(NonnullOwnPtr<Timer>&&); - u64 add_timer(u64 duration, TimeUnit, Function<void()>&& callback); + u64 add_timer(timeval& timeout, Function<void()>&& callback); bool cancel_timer(u64 id); void fire(); private: + TimerQueue(); + void update_next_timer_due(); + u64 microseconds_to_ticks(u64 micro_seconds) { return micro_seconds * (m_ticks_per_second / 1'000'000); } + u64 seconds_to_ticks(u64 seconds) { return seconds * m_ticks_per_second; } + u64 m_next_timer_due { 0 }; u64 m_timer_id_count { 0 }; + u64 m_ticks_per_second { 0 }; SinglyLinkedList<NonnullOwnPtr<Timer>> m_timer_queue; }; |