X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/86a9cfeadbbe180abf6c8bd8c64c86957fdacfeb..5aa59394dc172b205a0cc80315bc666a254507c0:/lunaix-os/includes/lunaix/ds/llist.h diff --git a/lunaix-os/includes/lunaix/ds/llist.h b/lunaix-os/includes/lunaix/ds/llist.h index dd2a192..9af9dd1 100644 --- a/lunaix-os/includes/lunaix/ds/llist.h +++ b/lunaix-os/includes/lunaix/ds/llist.h @@ -1,12 +1,13 @@ /** * @file llist.h * @author Lunaixsky - * @brief This doubly linked cyclic list is adopted from Linux kernel + * @brief This doubly linked cyclic list is adopted from Linux kernel + * * @version 0.1 * @date 2022-03-12 - * + * * @copyright Copyright (c) 2022 - * + * */ #ifndef __LUNAIX_LLIST_H #define __LUNAIX_LLIST_H @@ -31,7 +32,8 @@ __llist_add(struct llist_header* elem, } static inline void -llist_init_head(struct llist_header* head) { +llist_init_head(struct llist_header* head) +{ head->next = head; head->prev = head; } @@ -49,17 +51,20 @@ llist_prepend(struct llist_header* head, struct llist_header* elem) } static inline void -llist_delete(struct llist_header* elem) { +llist_delete(struct llist_header* elem) +{ elem->prev->next = elem->next; - elem->next->prev = elem->next; - + elem->next->prev = elem->prev; + // make elem orphaned elem->prev = elem; elem->next = elem; } -static inline int llist_empty(struct llist_header* elem) { - return elem->next == elem; +static inline int +llist_empty(struct llist_header* elem) +{ + return elem->next == elem && elem->prev == elem; } /** @@ -68,8 +73,7 @@ static inline int llist_empty(struct llist_header* elem) { * @type: the type of the struct this is embedded in. * @member: the name of the list_struct within the struct. */ -#define list_entry(ptr, type, member) \ - container_of(ptr, type, member) +#define list_entry(ptr, type, member) container_of(ptr, type, member) /** * list_for_each_entry - iterate over list of given type @@ -77,10 +81,33 @@ static inline int llist_empty(struct llist_header* elem) { * @head: the head for your list. * @member: the name of the list_struct within the struct. */ -#define llist_for_each(pos, n, head, member) \ - for (pos = list_entry((head)->next, typeof(*pos), member), \ - n = list_entry(pos->member.next, typeof(*pos), member); \ - &pos->member != (head); \ - pos = n, n = list_entry(n->member.next, typeof(*n), member)) +#define llist_for_each(pos, n, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member), \ + n = list_entry(pos->member.next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.next, typeof(*n), member)) + +struct hlist_node +{ + struct hlist_node *next, **pprev; +}; +static inline void +hlist_del(struct hlist_node* node) +{ + *node->pprev = node->next; + node->next = 0; + node->pprev = 0; +} + +static inline void +hlist_add(struct hlist_node** head, struct hlist_node* node) +{ + node->next = *head; + if (*head) { + (*head)->pprev = &node->next; + } + node->pprev = head; + *head = node; +} #endif /* __LUNAIX_LLIST_H */