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/src/libk/list.c | 40 ++++++++++++---------------------------- 1 file changed, 12 insertions(+), 28 deletions(-) (limited to 'kernel/src/libk') diff --git a/kernel/src/libk/list.c b/kernel/src/libk/list.c index be2e4e5..cb916ab 100644 --- a/kernel/src/libk/list.c +++ b/kernel/src/libk/list.c @@ -1,38 +1,22 @@ #include #include -void add_to_list_head(list_t** ptr, void* data) +void add_to_list(list_t* head, list_t* prev, list_t* next) { - list_t* node = (list_t*)kalloc(sizeof(list_t)); - node->data = data; - - node->next = *ptr; - *ptr = node; -} - -void add_to_list_tail(list_t** ptr, void* data) -{ - list_t* node = (list_t*)kalloc(sizeof(list_t)); - node->data = data; - node->next = NULL; - - if (*ptr == NULL) { - *ptr = node; - } else { - list_t* tmp = *ptr; - while (tmp->next != NULL) - tmp = tmp->next; - tmp->next = node; - } + head->prev = prev; + head->next = next; + prev->next = head; + next->prev = head; } -void free_list(list_t** ptr) +void free_node(list_t* head) { - if (*ptr == NULL) + if (head->prev == head->next) { + head = NULL; return; - - for (list_t* tmp = (*ptr)->next; tmp != NULL; tmp = tmp->next) { - kfree(*ptr); - *ptr = tmp; } + + head->next->prev = head->prev; + head->prev->next = head->next; + head = NULL; } -- cgit v1.2.3