aboutsummaryrefslogtreecommitdiff
path: root/kernel/util/list.c
diff options
context:
space:
mode:
authornthnluu <nate1299@me.com>2024-01-28 21:20:27 -0500
committernthnluu <nate1299@me.com>2024-01-28 21:20:27 -0500
commitc63f340d90800895f007de64b7d2d14624263331 (patch)
tree2c0849fa597dd6da831c8707b6f2603403778d7b /kernel/util/list.c
Created student weenix repository
Diffstat (limited to 'kernel/util/list.c')
-rw-r--r--kernel/util/list.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/kernel/util/list.c b/kernel/util/list.c
new file mode 100644
index 0000000..81a1beb
--- /dev/null
+++ b/kernel/util/list.c
@@ -0,0 +1,53 @@
+
+#include <util/debug.h>
+#include <util/list.h>
+
+inline void list_init(list_t *list) { list->l_next = list->l_prev = list; }
+
+inline void list_link_init(list_link_t *link)
+{
+ link->l_next = link->l_prev = NULL;
+}
+
+inline long list_link_is_linked(const list_link_t *link)
+{
+ return link->l_next && link->l_prev;
+}
+
+inline long list_empty(const list_t *list) { return list->l_next == list; }
+
+inline void list_assert_sanity(const list_t *list)
+{
+ KASSERT(list->l_next && list->l_next->l_prev && list->l_prev &&
+ list->l_prev->l_next);
+}
+
+inline void list_insert_before(list_link_t *link, list_link_t *to_insert)
+{
+ list_link_t *prev = to_insert;
+ list_link_t *next = link;
+ prev->l_next = next;
+ prev->l_prev = next->l_prev;
+ next->l_prev->l_next = prev;
+ next->l_prev = prev;
+}
+
+inline void list_insert_head(list_t *list, list_link_t *link)
+{
+ list_insert_before((list)->l_next, link);
+}
+
+inline void list_insert_tail(list_t *list, list_link_t *link)
+{
+ list_insert_before(list, link);
+}
+
+inline void list_remove(list_link_t *link)
+{
+ list_link_t *ll = link;
+ list_link_t *prev = ll->l_prev;
+ list_link_t *next = ll->l_next;
+ prev->l_next = next;
+ next->l_prev = prev;
+ ll->l_next = ll->l_prev = NULL;
+}