Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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/timerqueue_types.h>
7
8bool timerqueue_add(struct timerqueue_head *head, struct timerqueue_node *node);
9bool timerqueue_del(struct timerqueue_head *head, struct timerqueue_node *node);
10struct timerqueue_node *timerqueue_iterate_next(struct timerqueue_node *node);
11
12bool timerqueue_linked_add(struct timerqueue_linked_head *head, struct timerqueue_linked_node *node);
13
14/**
15 * timerqueue_getnext - Returns the timer with the earliest expiration time
16 *
17 * @head: head of timerqueue
18 *
19 * Returns a pointer to the timer node that has the earliest expiration time.
20 */
21static inline struct timerqueue_node *timerqueue_getnext(struct timerqueue_head *head)
22{
23 struct rb_node *leftmost = rb_first_cached(&head->rb_root);
24
25 return rb_entry_safe(leftmost, struct timerqueue_node, node);
26}
27
28static inline void timerqueue_init(struct timerqueue_node *node)
29{
30 RB_CLEAR_NODE(&node->node);
31}
32
33static inline bool timerqueue_node_queued(struct timerqueue_node *node)
34{
35 return !RB_EMPTY_NODE(&node->node);
36}
37
38static inline void timerqueue_init_head(struct timerqueue_head *head)
39{
40 head->rb_root = RB_ROOT_CACHED;
41}
42
43/* Timer queues with linked nodes */
44
45static __always_inline
46struct timerqueue_linked_node *timerqueue_linked_first(struct timerqueue_linked_head *head)
47{
48 return rb_entry_safe(head->rb_root.rb_leftmost, struct timerqueue_linked_node, node);
49}
50
51static __always_inline
52struct timerqueue_linked_node *timerqueue_linked_next(struct timerqueue_linked_node *node)
53{
54 return rb_entry_safe(node->node.next, struct timerqueue_linked_node, node);
55}
56
57static __always_inline
58struct timerqueue_linked_node *timerqueue_linked_prev(struct timerqueue_linked_node *node)
59{
60 return rb_entry_safe(node->node.prev, struct timerqueue_linked_node, node);
61}
62
63static __always_inline
64bool timerqueue_linked_del(struct timerqueue_linked_head *head, struct timerqueue_linked_node *node)
65{
66 return rb_erase_linked(&node->node, &head->rb_root);
67}
68
69static __always_inline void timerqueue_linked_init(struct timerqueue_linked_node *node)
70{
71 RB_CLEAR_LINKED_NODE(&node->node);
72}
73
74static __always_inline bool timerqueue_linked_node_queued(struct timerqueue_linked_node *node)
75{
76 return !RB_EMPTY_LINKED_NODE(&node->node);
77}
78
79static __always_inline void timerqueue_linked_init_head(struct timerqueue_linked_head *head)
80{
81 head->rb_root = RB_ROOT_LINKED;
82}
83
84#endif /* _LINUX_TIMERQUEUE_H */