Add removal safe TAILQ iterator.

TAILQ_FOREACH macro was not safe for element removal as it was
accessing the next element in case of a free. This patch is inspired
by Linux list handling and provide a new macro TAILQ_FOREACH_SAFE.
This macro is removal safe and only differs by a last argument being
a temporaty pointer to an element.
pull/231/head
Eric Leblond 12 years ago
parent 06751ecd75
commit 9c47ada771

@ -346,6 +346,13 @@ struct { \
(var) != TAILQ_END(head); \
(var) = TAILQ_NEXT(var, field))
/* removal safe iterator using a temprary element has last param */
#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \
for((var) = TAILQ_FIRST(head), \
(tvar) = TAILQ_FIRST(head) ? TAILQ_NEXT(TAILQ_FIRST(head), field): NULL ; \
(var) != TAILQ_END(head); \
(var = tvar), (tvar) = var ? TAILQ_NEXT(var, field): NULL)
#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \
for((var) = TAILQ_LAST(head, headname); \
(var) != TAILQ_END(head); \

@ -748,7 +748,8 @@ void *UnixManagerThread(void *td)
if ((ret == 0) || (TmThreadsCheckFlag(th_v, THV_KILL))) {
UnixClient *item;
TAILQ_FOREACH(item, &(&command)->clients, next) {
UnixClient *titem;
TAILQ_FOREACH_SAFE(item, &(&command)->clients, next, titem) {
close(item->fd);
SCFree(item);
}

Loading…
Cancel
Save