X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Flist.h;h=ddb0e6592babd20e9108e6d22b7ace2dc34af7f4;hb=8d7fb7eef5e10dc47710e86554018b256ba3272f;hp=845aab20b4917cbc6abce6e655c2f6491e1841bb;hpb=5f55c39b21e69025045437ffbd3bb98fe6ce2e89;p=sliver-openvswitch.git diff --git a/lib/list.h b/lib/list.h index 845aab20b..ddb0e6592 100644 --- a/lib/list.h +++ b/lib/list.h @@ -31,6 +31,7 @@ struct list { #define LIST_INITIALIZER(LIST) { LIST, LIST } void list_init(struct list *); +void list_poison(struct list *); /* List insertion. */ void list_insert(struct list *, struct list *); @@ -53,18 +54,19 @@ struct list *list_back(struct list *); size_t list_size(const struct list *); bool list_is_empty(const struct list *); -#define LIST_FOR_EACH(ITER, STRUCT, MEMBER, LIST) \ - for (ITER = CONTAINER_OF((LIST)->next, STRUCT, MEMBER); \ - &(ITER)->MEMBER != (LIST); \ - ITER = CONTAINER_OF((ITER)->MEMBER.next, STRUCT, MEMBER)) -#define LIST_FOR_EACH_REVERSE(ITER, STRUCT, MEMBER, LIST) \ - for (ITER = CONTAINER_OF((LIST)->prev, STRUCT, MEMBER); \ - &(ITER)->MEMBER != (LIST); \ - ITER = CONTAINER_OF((ITER)->MEMBER.prev, STRUCT, MEMBER)) -#define LIST_FOR_EACH_SAFE(ITER, NEXT, STRUCT, MEMBER, LIST) \ - for (ITER = CONTAINER_OF((LIST)->next, STRUCT, MEMBER); \ - (NEXT = CONTAINER_OF((ITER)->MEMBER.next, STRUCT, MEMBER), \ - &(ITER)->MEMBER != (LIST)); \ - ITER = NEXT) +#define LIST_FOR_EACH(ITER, MEMBER, LIST) \ + for (ASSIGN_CONTAINER(ITER, (LIST)->next, MEMBER); \ + &(ITER)->MEMBER != (LIST); \ + ASSIGN_CONTAINER(ITER, (ITER)->MEMBER.next, MEMBER)) +#define LIST_FOR_EACH_REVERSE(ITER, MEMBER, LIST) \ + for (ASSIGN_CONTAINER(ITER, (LIST)->prev, MEMBER); \ + &(ITER)->MEMBER != (LIST); \ + ASSIGN_CONTAINER(ITER, (ITER)->MEMBER.prev, MEMBER)) +#define LIST_FOR_EACH_SAFE(ITER, NEXT, MEMBER, LIST) \ + for (ASSIGN_CONTAINER(ITER, (LIST)->next, MEMBER); \ + (&(ITER)->MEMBER != (LIST) \ + ? ASSIGN_CONTAINER(NEXT, (ITER)->MEMBER.next, MEMBER) \ + : 0); \ + (ITER) = (NEXT)) #endif /* list.h */