5#include <linux/types.h>
6#include <linux/stddef.h>
7#include <linux/poison.h>
8#include <linux/const.h>
9#include <linux/kernel.h>
10#include <linux/prefetch.h>
11#include <asm/system.h>
32#define WRITE_ONCE(x,y) x = y
35#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
44#define container_of(ptr, type, member) ({ \
45 const typeof( ((type *)0)->member ) *__mptr = (ptr); \
46 (type *)( (char *)__mptr - offsetof(type,member) );})
70#define LIST_HEAD_INIT(name) { &(name), &(name) }
72#define LIST_HEAD(name) \
73 struct list_head name = LIST_HEAD_INIT(name)
77 WRITE_ONCE(list->next, list);
81#ifdef CONFIG_DEBUG_LIST
82extern bool __list_add_valid(
struct list_head *newent,
85extern bool __list_del_entry_valid(
struct list_head *entry);
92 newent++; prev++; next++;
111 if (!__list_add_valid(newent, prev, next))
117 WRITE_ONCE(prev->next, newent);
130 __list_add(newent, head, head->next);
144 __list_add(newent, head->prev, head);
157 WRITE_ONCE(prev->next, next);
168 if (!__list_del_entry_valid(entry))
171 __list_del(entry->prev, entry->next);
176 __list_del_entry(entry);
177 entry->next = (
struct list_head*)LIST_POISON1;
178 entry->prev = (
struct list_head*)LIST_POISON2;
191 newent->next = old->next;
192 newent->next->prev = newent;
193 newent->prev = old->prev;
194 newent->prev->next = newent;
200 list_replace(old, newent);
210 __list_del_entry(entry);
211 INIT_LIST_HEAD(entry);
221 __list_del_entry(list);
222 list_add(list, head);
233 __list_del_entry(list);
234 list_add_tail(list, head);
245 return list->next == head;
254 return READ_ONCE(head->next) == head;
273 return (next == head) && (next == head->prev);
284 if (!list_empty(head)) {
286 list_move_tail(first, head);
296 return !list_empty(head) && (head->next == head->prev);
302 struct list_head *new_first = entry->next;
303 list->next = head->next;
304 list->next->prev = list;
307 head->next = new_first;
308 new_first->prev = head;
328 if (list_empty(head))
330 if (list_is_singular(head) &&
331 (head->next != entry && head != entry))
334 INIT_LIST_HEAD(list);
336 __list_cut_position(list, head, entry);
361 if (!list_empty(list))
362 __list_splice(list, head, head->next);
373 if (!list_empty(list))
374 __list_splice(list, head->prev, head);
387 if (!list_empty(list)) {
388 __list_splice(list, head, head->next);
389 INIT_LIST_HEAD(list);
404 if (!list_empty(list)) {
405 __list_splice(list, head->prev, head);
406 INIT_LIST_HEAD(list);
416#define list_entry(ptr, type, member) \
417 container_of(ptr, type, member)
427#define list_first_entry(ptr, type, member) \
428 list_entry((ptr)->next, type, member)
438#define list_last_entry(ptr, type, member) \
439 list_entry((ptr)->prev, type, member)
449#define list_first_entry_or_null(ptr, type, member) ({ \
450 struct list_head *head__ = (ptr); \
451 struct list_head *pos__ = READ_ONCE(head__->next); \
452 pos__ != head__ ? list_entry(pos__, type, member) : NULL; \
460#define list_next_entry(pos, member) \
461 list_entry((pos)->member.next, typeof(*(pos)), member)
468#define list_prev_entry(pos, member) \
469 list_entry((pos)->member.prev, typeof(*(pos)), member)
476#define list_for_each(pos, head) \
477 for (pos = (head)->next; pos != (head); pos = pos->next)
484#define list_for_each_prev(pos, head) \
485 for (pos = (head)->prev; pos != (head); pos = pos->prev)
493#define list_for_each_safe(pos, n, head) \
494 for (pos = (head)->next, n = pos->next; pos != (head); \
495 pos = n, n = pos->next)
503#define list_for_each_prev_safe(pos, n, head) \
504 for (pos = (head)->prev, n = pos->prev; \
506 pos = n, n = pos->prev)
514#define list_for_each_entry(pos, head, member) \
515 for (pos = list_first_entry(head, typeof(*pos), member); \
516 &pos->member != (head); \
517 pos = list_next_entry(pos, member))
525#define list_for_each_entry_reverse(pos, head, member) \
526 for (pos = list_last_entry(head, typeof(*pos), member); \
527 &pos->member != (head); \
528 pos = list_prev_entry(pos, member))
538#define list_prepare_entry(pos, head, member) \
539 ((pos) ? : list_entry(head, typeof(*pos), member))
550#define list_for_each_entry_continue(pos, head, member) \
551 for (pos = list_next_entry(pos, member); \
552 &pos->member != (head); \
553 pos = list_next_entry(pos, member))
564#define list_for_each_entry_continue_reverse(pos, head, member) \
565 for (pos = list_prev_entry(pos, member); \
566 &pos->member != (head); \
567 pos = list_prev_entry(pos, member))
577#define list_for_each_entry_from(pos, head, member) \
578 for (; &pos->member != (head); \
579 pos = list_next_entry(pos, member))
590#define list_for_each_entry_from_reverse(pos, head, member) \
591 for (; &pos->member != (head); \
592 pos = list_prev_entry(pos, member))
601#define list_for_each_entry_safe(pos, n, head, member) \
602 for (pos = list_first_entry(head, typeof(*pos), member), \
603 n = list_next_entry(pos, member); \
604 &pos->member != (head); \
605 pos = n, n = list_next_entry(n, member))
617#define list_for_each_entry_safe_continue(pos, n, head, member) \
618 for (pos = list_next_entry(pos, member), \
619 n = list_next_entry(pos, member); \
620 &pos->member != (head); \
621 pos = n, n = list_next_entry(n, member))
633#define list_for_each_entry_safe_from(pos, n, head, member) \
634 for (n = list_next_entry(pos, member); \
635 &pos->member != (head); \
636 pos = n, n = list_next_entry(n, member))
648#define list_for_each_entry_safe_reverse(pos, n, head, member) \
649 for (pos = list_last_entry(head, typeof(*pos), member), \
650 n = list_prev_entry(pos, member); \
651 &pos->member != (head); \
652 pos = n, n = list_prev_entry(n, member))
666#define list_safe_reset_next(pos, n, member) \
667 n = list_next_entry(pos, member)
676#define HLIST_HEAD_INIT { .first = NULL }
677#define HLIST_HEAD(name) struct hlist_head name = { .first = NULL }
678#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL)
692 return !READ_ONCE(h->first);
700 WRITE_ONCE(*pprev, next);
714 if (!hlist_unhashed(n)) {
725 first->pprev = &n->next;
726 WRITE_ONCE(h->first, n);
727 n->pprev = &h->first;
734 n->pprev = next->pprev;
736 next->pprev = &n->next;
737 WRITE_ONCE(*(n->pprev), n);
743 n->next = prev->next;
744 WRITE_ONCE(prev->next, n);
745 n->pprev = &prev->next;
748 n->next->pprev = &n->next;
759 return h->pprev == &h->next;
769 return !n->next && n->pprev == &h->first;
779 newent->first = old->first;
781 newent->first->pprev = &newent->first;
785#define hlist_entry(ptr, type, member) container_of(ptr,type,member)
787#define hlist_for_each(pos, head) \
788 for (pos = (head)->first; pos ; pos = pos->next)
790#define hlist_for_each_safe(pos, n, head) \
791 for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
794#define hlist_entry_safe(ptr, type, member) \
795 ({ typeof(ptr) ____ptr = (ptr); \
796 ____ptr ? hlist_entry(____ptr, type, member) : NULL; \
805#define hlist_for_each_entry(pos, head, member) \
806 for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);\
808 pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
815#define hlist_for_each_entry_continue(pos, member) \
816 for (pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member);\
818 pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
825#define hlist_for_each_entry_from(pos, member) \
827 pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
836#define hlist_for_each_entry_safe(pos, n, head, member) \
837 for (pos = hlist_entry_safe((head)->first, typeof(*pos), member);\
838 pos && ({ n = pos->member.next; 1; }); \
839 pos = hlist_entry_safe(n, typeof(*pos), member))
Defines constants that for some reason are not defined on some systems.
#define UPNP_INLINE
Declares an inline function.
Definition: UpnpGlobal.h:99