X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Flist%2Flist.h;h=cdd5eeb7e6e8523a85e348c7f775a65ca1185260;hp=4d1d34e327090f8bc568a9ea8cf5e4eb79006fa4;hb=ec8654d94d3c5c47aa5f82698f7e8048c79765b1;hpb=a7b28fafda0e5c119a2507ef2fd0d5b620cdb892 diff --git a/ccan/list/list.h b/ccan/list/list.h index 4d1d34e3..cdd5eeb7 100644 --- a/ccan/list/list.h +++ b/ccan/list/list.h @@ -145,6 +145,18 @@ static inline void list_head_init(struct list_head *h) h->n.next = h->n.prev = &h->n; } +/** + * list_node_init - initialize a list_node + * @n: the list_node to link to itself. + * + * You don't need to use this normally! But it lets you list_del(@n) + * safely. + */ +static inline void list_node_init(struct list_node *n) +{ + n->next = n->prev = n; +} + /** * list_add - add an entry at the start of a linked list. * @h: the list_head to add the node to @@ -237,7 +249,7 @@ static inline bool list_empty_nodebug(const struct list_head *h) * another list, but not deleted again. * * See also: - * list_del_from() + * list_del_from(), list_del_init() * * Example: * list_del(&child->list); @@ -255,6 +267,27 @@ static inline void list_del_(struct list_node *n, const char* abortstr) #endif } +/** + * list_del_init - delete a node, and reset it so it can be deleted again. + * @n: the list_node to be deleted. + * + * list_del(@n) or list_del_init() again after this will be safe, + * which can be useful in some cases. + * + * See also: + * list_del_from(), list_del() + * + * Example: + * list_del_init(&child->list); + * parent->num_children--; + */ +#define list_del_init(n) list_del_init_(n, LIST_LOC) +static inline void list_del_init_(struct list_node *n, const char *abortstr) +{ + list_del_(n, abortstr); + list_node_init(n); +} + /** * list_del_from - delete an entry from a known linked list. * @h: the list_head the node is in.