shl: dlist: fix *_but_one() loops to allow "start == head"

If we iterate over a non-empty list and pass the same pointer for start
and head, then we will never leave that loop.

It might be unclear why this is supported at all as we can simply use the
shl_dlist_for_each() for that. However, it makes code a lot easier to read
if the user can simply use shl_dlist_for_each_but_one() without checking
whether they passed the same for start and head.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2012-11-10 16:42:42 +01:00
parent f9e2818b9a
commit 2fe1d7b0fe

View File

@ -110,7 +110,9 @@ static inline bool shl_dlist_empty(struct shl_dlist *head)
(start)->next->next : \
(start)->next; \
iter != (start); \
iter = (iter->next == (head)) ? iter->next->next : iter->next)
iter = (iter->next == (head) && (start) != (head)) ? \
iter->next->next : \
iter->next)
#define shl_dlist_for_each_safe(iter, tmp, head) \
for (iter = (head)->next, tmp = iter->next; iter != (head); \
@ -124,7 +126,9 @@ static inline bool shl_dlist_empty(struct shl_dlist *head)
(start)->prev->prev : \
(start)->prev; \
iter != (start); \
iter = (iter->prev == (head)) ? iter->prev->prev : iter->prev)
iter = (iter->prev == (head) && (start) != (head)) ? \
iter->prev->prev : \
iter->prev)
#define shl_dlist_for_each_reverse_safe(iter, tmp, head) \
for (iter = (head)->prev, tmp = iter->prev; iter != (head); \