| struct list_head { |
| struct list_head *next; |
| }; |
| |
| #define LIST_HEAD(name) \ |
| struct list_head name = { &(name) } |
| |
| static inline int list_empty(const struct list_head *head) |
| { |
| return head->next == head; |
| } |
| |
| static inline void list_add(struct list_head *new, struct list_head *head) |
| { |
| new->next = head->next; |
| head->next = new; |
| } |
| |
| static inline void list_del(struct list_head *entry, struct list_head *prev) |
| { |
| prev->next = entry->next; |
| entry->next = entry; |
| } |
| |
| #define list_for_each_safe(pos, n, head) \ |
| for (n = (head), pos = (head)->next; pos != (head); \ |
| n = pos, pos = n->next) |
| |
| #undef offsetof |
| #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) |
| |
| #define container_of(ptr, type, member) ({ \ |
| const __typeof__( ((type *)0)->member ) *__mptr = (ptr);\ |
| (type *)( (char *)__mptr - offsetof(type,member) );}) |
| |
| #ifdef DEBUG |
| #define pynl_dbg(fmt, ...) \ |
| fprintf(stderr, "%s: " fmt, __func__, __VA_ARGS__) |
| #else |
| #define pynl_dbg(fmt, ...) |
| #endif |