1 | /* SPDX-License-Identifier: GPL-2.0 */ |
---|---|
2 | #ifndef _LINUX_TIMERQUEUE_H |
3 | #define _LINUX_TIMERQUEUE_H |
4 | |
5 | #include <linux/rbtree.h> |
6 | #include <linux/ktime.h> |
7 | |
8 | |
9 | struct timerqueue_node { |
10 | struct rb_node node; |
11 | ktime_t expires; |
12 | }; |
13 | |
14 | struct timerqueue_head { |
15 | struct rb_root_cached rb_root; |
16 | }; |
17 | |
18 | |
19 | extern bool timerqueue_add(struct timerqueue_head *head, |
20 | struct timerqueue_node *node); |
21 | extern bool timerqueue_del(struct timerqueue_head *head, |
22 | struct timerqueue_node *node); |
23 | extern struct timerqueue_node *timerqueue_iterate_next( |
24 | struct timerqueue_node *node); |
25 | |
26 | /** |
27 | * timerqueue_getnext - Returns the timer with the earliest expiration time |
28 | * |
29 | * @head: head of timerqueue |
30 | * |
31 | * Returns a pointer to the timer node that has the earliest expiration time. |
32 | */ |
33 | static inline |
34 | struct timerqueue_node *timerqueue_getnext(struct timerqueue_head *head) |
35 | { |
36 | struct rb_node *leftmost = rb_first_cached(&head->rb_root); |
37 | |
38 | return rb_entry_safe(leftmost, struct timerqueue_node, node); |
39 | } |
40 | |
41 | static inline void timerqueue_init(struct timerqueue_node *node) |
42 | { |
43 | RB_CLEAR_NODE(&node->node); |
44 | } |
45 | |
46 | static inline bool timerqueue_node_queued(struct timerqueue_node *node) |
47 | { |
48 | return !RB_EMPTY_NODE(&node->node); |
49 | } |
50 | |
51 | static inline bool timerqueue_node_expires(struct timerqueue_node *node) |
52 | { |
53 | return node->expires; |
54 | } |
55 | |
56 | static inline void timerqueue_init_head(struct timerqueue_head *head) |
57 | { |
58 | head->rb_root = RB_ROOT_CACHED; |
59 | } |
60 | #endif /* _LINUX_TIMERQUEUE_H */ |
61 |