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 #include #include +#include #include 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) { - 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) return m_timer_id_count; } -u64 TimerQueue::add_timer(u64 duration, TimeUnit unit, Function&& callback) +u64 TimerQueue::add_timer(timeval& deadline, Function&& callback) { NonnullOwnPtr timer = make(); - 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&&); - u64 add_timer(u64 duration, TimeUnit, Function&& callback); + u64 add_timer(timeval& timeout, Function&& 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> m_timer_queue; };