summaryrefslogtreecommitdiff
path: root/kernel/include/libk/list.h
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksav013@gmail.com>2022-12-04 14:13:08 +0100
committerAleksa Vuckovic <aleksav013@gmail.com>2022-12-04 14:13:08 +0100
commita36b01e05f09f642f261d42666af28a367fefc4e (patch)
treed5e2a8782f2e44af43d66fd7d1dcade517889f6a /kernel/include/libk/list.h
parent0882221263aa14669946f57578d3ee014493f58f (diff)
intrusive circular doubly linked list
Diffstat (limited to 'kernel/include/libk/list.h')
-rw-r--r--kernel/include/libk/list.h31
1 files changed, 27 insertions, 4 deletions
diff --git a/kernel/include/libk/list.h b/kernel/include/libk/list.h
index f6a97f8..1cd9928 100644
--- a/kernel/include/libk/list.h
+++ b/kernel/include/libk/list.h
@@ -1,14 +1,37 @@
#ifndef LIST_H
#define LIST_H
+#include <containter_of.h>
+
struct list_t {
struct list_t* next;
- void* data;
+ struct list_t* prev;
};
typedef struct list_t list_t;
-void add_to_list_head(list_t** ptr, void* data);
-void add_to_list_tail(list_t** ptr, void* data);
-void free_list(list_t** ptr);
+void add_to_list(list_t* head, list_t* prev, list_t* next);
+void free_node(list_t* head);
+
+#define INIT_LIST(name) \
+ name.next = &name; \
+ name.prev = &name;
+
+#define list_for_each(pos, head) \
+ for (pos = head->next; pos != head; pos = pos->next)
+
+#define list_next_entry(pos, member) \
+ container_of(pos->member.next, typeof(*pos), member)
+
+#define list_prev_entry(pos, member) \
+ container_of(pos->member.prev, typeof(*pos), member)
+
+#define list_for_each_entry(pos, head, member) \
+ for (pos = container_of(head->next, typeof(*pos), member); pos != container_of(head, typeof(*pos), member); pos = container_of(pos->member.next, typeof(*pos), member))
+
+#define list_for_each_entry_prev(pos, head, member) \
+ for (pos = container_of(head->prev, typeof(*pos), member); pos != container_of(head, typeof(*pos), member); pos = container_of(pos->member.prev, typeof(*pos), member))
+
+#define list_is_empty(pos) \
+ (pos == pos->next)
#endif