From 2fe1d7b0fee4c4263efaf3c14063560a612217fd Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Sat, 10 Nov 2012 16:42:42 +0100 Subject: [PATCH] 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 --- src/shl_dlist.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/shl_dlist.h b/src/shl_dlist.h index cc6a1f2..c1d4beb 100644 --- a/src/shl_dlist.h +++ b/src/shl_dlist.h @@ -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); \