This source file includes following definitions.
- timerqueue_add
- timerqueue_del
- timerqueue_iterate_next
1
2
3
4
5
6
7
8
9
10
11
12 #include <linux/bug.h>
13 #include <linux/timerqueue.h>
14 #include <linux/rbtree.h>
15 #include <linux/export.h>
16
17
18
19
20
21
22
23
24
25
26
27 bool timerqueue_add(struct timerqueue_head *head, struct timerqueue_node *node)
28 {
29 struct rb_node **p = &head->rb_root.rb_root.rb_node;
30 struct rb_node *parent = NULL;
31 struct timerqueue_node *ptr;
32 bool leftmost = true;
33
34
35 WARN_ON_ONCE(!RB_EMPTY_NODE(&node->node));
36
37 while (*p) {
38 parent = *p;
39 ptr = rb_entry(parent, struct timerqueue_node, node);
40 if (node->expires < ptr->expires) {
41 p = &(*p)->rb_left;
42 } else {
43 p = &(*p)->rb_right;
44 leftmost = false;
45 }
46 }
47 rb_link_node(&node->node, parent, p);
48 rb_insert_color_cached(&node->node, &head->rb_root, leftmost);
49
50 return leftmost;
51 }
52 EXPORT_SYMBOL_GPL(timerqueue_add);
53
54
55
56
57
58
59
60
61
62
63 bool timerqueue_del(struct timerqueue_head *head, struct timerqueue_node *node)
64 {
65 WARN_ON_ONCE(RB_EMPTY_NODE(&node->node));
66
67 rb_erase_cached(&node->node, &head->rb_root);
68 RB_CLEAR_NODE(&node->node);
69
70 return !RB_EMPTY_ROOT(&head->rb_root.rb_root);
71 }
72 EXPORT_SYMBOL_GPL(timerqueue_del);
73
74
75
76
77
78
79
80
81
82
83 struct timerqueue_node *timerqueue_iterate_next(struct timerqueue_node *node)
84 {
85 struct rb_node *next;
86
87 if (!node)
88 return NULL;
89 next = rb_next(&node->node);
90 if (!next)
91 return NULL;
92 return container_of(next, struct timerqueue_node, node);
93 }
94 EXPORT_SYMBOL_GPL(timerqueue_iterate_next);