12
#include <lib/libds/priolist.h>
14
void priolist_add(struct priolist_link *link, struct priolist *list) {
15
struct dlist_head *next_node_link = &list->node_list;
18
assert(dlist_empty(&link->node_link));
19
assert(dlist_empty(&link->prio_link));
21
if (!priolist_empty(list)) {
22
struct priolist_link *first = priolist_first(list);
23
struct priolist_link *iter = first, *last = NULL;
26
if (iter->prio > link->prio) {
27
next_node_link = &iter->node_link;
32
iter = mcast_out(iter->prio_link.next,
33
struct priolist_link, prio_link);
34
} while (iter != first);
36
if (!last || last->prio != link->prio)
38
dlist_add_prev(&link->prio_link, &iter->prio_link);
41
dlist_add_prev(&link->node_link, next_node_link);
44
void priolist_del(struct priolist_link *link, struct priolist *list) {
46
assert(!dlist_empty(&link->node_link));
47
assert(!dlist_empty(&list->node_list));
49
if (!dlist_empty(&link->prio_link)) {
50
struct dlist_head *next_node_link = link->node_link.next;
52
if (next_node_link != &list->node_list) {
53
struct priolist_link *next =
54
mcast_out(next_node_link,
58
if (dlist_empty(&next->prio_link))
59
dlist_add_next(&next->prio_link, &link->prio_link);
62
dlist_del_init(&link->prio_link);
65
dlist_del_init(&link->node_link);