mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 05:07:35 +00:00
Kernel: Add kernel-level timer queue (heavily based on @juliusf's work)
PR #591 defines the rationale for kernel-level timers. They're most immediately useful for TCP retransmission, but will most likely see use in many other areas as well.
This commit is contained in:
parent
13cf7e76b9
commit
115b315375
4 changed files with 124 additions and 0 deletions
48
Kernel/TimerQueue.h
Normal file
48
Kernel/TimerQueue.h
Normal file
|
@ -0,0 +1,48 @@
|
|||
#pragma once
|
||||
|
||||
#include <AK/Function.h>
|
||||
#include <AK/NonnullOwnPtr.h>
|
||||
#include <AK/OwnPtr.h>
|
||||
#include <AK/SinglyLinkedList.h>
|
||||
#include <Kernel/Arch/i386/PIT.h>
|
||||
|
||||
struct Timer {
|
||||
u64 id;
|
||||
u64 expires;
|
||||
Function<void()> callback;
|
||||
bool operator<(const Timer& rhs) const
|
||||
{
|
||||
return expires < rhs.expires;
|
||||
}
|
||||
bool operator>(const Timer& rhs) const
|
||||
{
|
||||
return expires > rhs.expires;
|
||||
}
|
||||
bool operator==(const Timer& rhs) const
|
||||
{
|
||||
return id == rhs.id;
|
||||
}
|
||||
};
|
||||
|
||||
enum TimeUnit {
|
||||
MS = TICKS_PER_SECOND / 1000,
|
||||
S = TICKS_PER_SECOND,
|
||||
M = TICKS_PER_SECOND * 60
|
||||
};
|
||||
|
||||
class TimerQueue {
|
||||
public:
|
||||
static TimerQueue& the();
|
||||
|
||||
u64 add_timer(NonnullOwnPtr<Timer>&&);
|
||||
u64 add_timer(u64 duration, TimeUnit, Function<void()>&& callback);
|
||||
bool cancel_timer(u64 id);
|
||||
void fire();
|
||||
|
||||
private:
|
||||
void update_next_timer_due();
|
||||
|
||||
u64 m_next_timer_due { 0 };
|
||||
u64 m_timer_id_count { 0 };
|
||||
SinglyLinkedList<NonnullOwnPtr<Timer>> m_timer_queue;
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue