The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/lib/list_debug.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Copyright 2006, Red Hat, Inc., Dave Jones
    3  * Released under the General Public License (GPL).
    4  *
    5  * This file contains the linked list implementations for
    6  * DEBUG_LIST.
    7  */
    8 
    9 #include <linux/export.h>
   10 #include <linux/list.h>
   11 #include <linux/bug.h>
   12 #include <linux/kernel.h>
   13 #include <linux/rculist.h>
   14 
   15 /*
   16  * Insert a new entry between two known consecutive entries.
   17  *
   18  * This is only for internal list manipulation where we know
   19  * the prev/next entries already!
   20  */
   21 
   22 void __list_add(struct list_head *new,
   23                               struct list_head *prev,
   24                               struct list_head *next)
   25 {
   26         WARN(next->prev != prev,
   27                 "list_add corruption. next->prev should be "
   28                 "prev (%p), but was %p. (next=%p).\n",
   29                 prev, next->prev, next);
   30         WARN(prev->next != next,
   31                 "list_add corruption. prev->next should be "
   32                 "next (%p), but was %p. (prev=%p).\n",
   33                 next, prev->next, prev);
   34         WARN(new == prev || new == next,
   35              "list_add double add: new=%p, prev=%p, next=%p.\n",
   36              new, prev, next);
   37         next->prev = new;
   38         new->next = next;
   39         new->prev = prev;
   40         prev->next = new;
   41 }
   42 EXPORT_SYMBOL(__list_add);
   43 
   44 void __list_del_entry(struct list_head *entry)
   45 {
   46         struct list_head *prev, *next;
   47 
   48         prev = entry->prev;
   49         next = entry->next;
   50 
   51         if (WARN(next == LIST_POISON1,
   52                 "list_del corruption, %p->next is LIST_POISON1 (%p)\n",
   53                 entry, LIST_POISON1) ||
   54             WARN(prev == LIST_POISON2,
   55                 "list_del corruption, %p->prev is LIST_POISON2 (%p)\n",
   56                 entry, LIST_POISON2) ||
   57             WARN(prev->next != entry,
   58                 "list_del corruption. prev->next should be %p, "
   59                 "but was %p\n", entry, prev->next) ||
   60             WARN(next->prev != entry,
   61                 "list_del corruption. next->prev should be %p, "
   62                 "but was %p\n", entry, next->prev))
   63                 return;
   64 
   65         __list_del(prev, next);
   66 }
   67 EXPORT_SYMBOL(__list_del_entry);
   68 
   69 /**
   70  * list_del - deletes entry from list.
   71  * @entry: the element to delete from the list.
   72  * Note: list_empty on entry does not return true after this, the entry is
   73  * in an undefined state.
   74  */
   75 void list_del(struct list_head *entry)
   76 {
   77         __list_del_entry(entry);
   78         entry->next = LIST_POISON1;
   79         entry->prev = LIST_POISON2;
   80 }
   81 EXPORT_SYMBOL(list_del);
   82 
   83 /*
   84  * RCU variants.
   85  */
   86 void __list_add_rcu(struct list_head *new,
   87                     struct list_head *prev, struct list_head *next)
   88 {
   89         WARN(next->prev != prev,
   90                 "list_add_rcu corruption. next->prev should be prev (%p), but was %p. (next=%p).\n",
   91                 prev, next->prev, next);
   92         WARN(prev->next != next,
   93                 "list_add_rcu corruption. prev->next should be next (%p), but was %p. (prev=%p).\n",
   94                 next, prev->next, prev);
   95         new->next = next;
   96         new->prev = prev;
   97         rcu_assign_pointer(list_next_rcu(prev), new);
   98         next->prev = new;
   99 }
  100 EXPORT_SYMBOL(__list_add_rcu);

Cache object: 627f43552735f35a6526d40998653af1


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.