X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/088403ac98acf7991507715d29a282dcba222053..af8e873ae38b72a56a89485c62bb5ccd22a9f8a7:/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 79fa991..6129ca0 100644 --- a/lunaix-os/includes/lunaix/ds/llist.h +++ b/lunaix-os/includes/lunaix/ds/llist.h @@ -41,13 +41,13 @@ llist_init_head(struct llist_header* head) static inline void llist_append(struct llist_header* head, struct llist_header* elem) { - __llist_add(elem, head, head->next); + __llist_add(elem, head->prev, head); } static inline void llist_prepend(struct llist_header* head, struct llist_header* elem) { - __llist_add(elem, head->prev, head); + __llist_add(elem, head, head->next); } static inline void @@ -57,14 +57,14 @@ llist_delete(struct llist_header* elem) elem->next->prev = elem->prev; // make elem orphaned - // elem->prev = elem; - // elem->next = elem; + elem->prev = elem; + elem->next = elem; } static inline int llist_empty(struct llist_header* elem) { - return elem->next == elem; + return elem->next == elem && elem->prev == elem; } /** @@ -87,4 +87,27 @@ llist_empty(struct llist_header* elem) &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 */