X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Flist%2Flist.h;h=5c9aa2a689ca38af5a03c5c7c928381bf7b3c443;hp=1feb58919142fc3bbe6d0eee23418ca52c27c6e9;hb=578da7e7b6265153fa0519035fc52a086a711ac0;hpb=2eff9a654f86ec238ddda60f928dccfcd0767645 diff --git a/ccan/list/list.h b/ccan/list/list.h index 1feb5891..5c9aa2a6 100644 --- a/ccan/list/list.h +++ b/ccan/list/list.h @@ -4,6 +4,7 @@ #include #include #include +#include /** * struct list_node - an entry in a doubly-linked list @@ -280,7 +281,7 @@ static inline void list_del_from(struct list_head *h, struct list_node *n) * first = list_top(&parent->children, struct child, list); */ #define list_top(h, type, member) \ - ((type *)list_top_((h), container_off((h)->n.next, type, member))) + ((type *)list_top_((h), list_off_(type, member))) static inline const void *list_top_(const struct list_head *h, size_t off) { @@ -302,7 +303,7 @@ static inline const void *list_top_(const struct list_head *h, size_t off) * last = list_tail(&parent->children, struct child, list); */ #define list_tail(h, type, member) \ - ((type *)list_tail_((h), container_off((h)->n.next, type, member))) + ((type *)list_tail_((h), list_off_(type, member))) static inline const void *list_tail_(const struct list_head *h, size_t off) { @@ -370,4 +371,10 @@ static inline const void *list_tail_(const struct list_head *h, size_t off) nxt = container_of_var(i->member.next, i, member); \ &i->member != &(h)->n; \ i = nxt, nxt = container_of_var(i->member.next, i, member)) + +/* Get the offset of the member, but make sure it's a list_node. */ +#define list_off_(type, member) \ + (container_off(type, member) + \ + check_type(((type *)0)->member, struct list_node)) + #endif /* CCAN_LIST_H */