diff --git a/ChangeLog b/ChangeLog index f7243e80c2..bb4705a570 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Sun Sep 14 08:41:44 2014 Eric Wong + + * ccan/list/list.h (list_del_init, list_node_init): new functions + for multiple list_del() calls + [ccan ec8654d94d3c5c47aa5f82698f7e8048c79765b1] (Rusty Russell) + Sat Sep 13 22:19:26 2014 Bernard Potocki * hash.c (rb_hash_aset): fix misleading example which may suggest diff --git a/ccan/list/list.h b/ccan/list/list.h index 838ded45d5..749db7849a 100644 --- a/ccan/list/list.h +++ b/ccan/list/list.h @@ -91,6 +91,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 @@ -183,7 +195,7 @@ static inline int 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); @@ -201,6 +213,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.