struct timer {
struct hlist_node hlist_node;
time_us_t expiration_us;
void (*func)(struct timer *timer);
enum timer_flags flags;
void *data;
};
enum timer_flags {
TIMER_FLAG_NONE = 0,
TIMER_FLAG_DEFERRABLE = 1 << 18,
TIMER_FLAG_IRQ = 1 << 19,
TIMER_FLAG_MIGRATING = 1 << 20,
TIMER_FLAG_PINNED = 1 << 21,
};
void timer_bucket_set(struct timer *timer, uint32_t bucket);
uint32_t timer_bucket_get(struct timer *timer);
void timer_cpu_set(struct timer *timer, cpu_id_t cpu);
cpu_id_t timer_cpu_get(struct timer *timer);
void timer_init(struct timer *timer, void (*func)(struct timer *), void *data);
void timer_add(struct timer *timer);
void timer_add_on(struct timer *timer, cpu_id_t cpu);
void timer_add_local(struct timer *timer);
void timer_add_global(struct timer *timer);
bool timer_modify(struct timer *timer, time_us_t new);
bool timer_modify_pending(struct timer *timer, time_us_t new);
bool timer_modify_reduce(struct timer *timer, time_us_t new);
bool timer_delete(struct timer *timer);
bool timer_delete_sync(struct timer *timer);
bool timer_shutdown(struct timer *timer);
bool timer_shutdown_sync(struct timer *timer);
enum irq_result timer_isr(void *ctx, irq_t vec, struct irq_context * *);
void timers_init(void);
time_us_t timer_delta_us(time_us_t delta_us);
#define TIMER_FLAG_CPU_MASK 0x0003FFFF
#define TIMER_FLAG_CPU(c) ((c) & TIMER_FLAG_CPU_MASK)
#define TIMER_FLAG_BUCKET_MASK 0x3FF
#define TIMER_FLAG_BUCKET_SHIFT 22
#define TIMER_FLAG_BUCKET(b) \
(((b) & TIMER_FLAG_BUCKET_MASK) << TIMER_FLAG_BUCKET_SHIFT)
#define TIMER_DECLARE(n, fn, ...) \
struct timer n = (struct timer) { \
.func = fn \
}