From a36b01e05f09f642f261d42666af28a367fefc4e Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Sun, 4 Dec 2022 14:13:08 +0100 Subject: intrusive circular doubly linked list --- kernel/include/libk/list.h | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) (limited to 'kernel/include/libk') 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 + 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 -- cgit v1.2.3