root/drivers/gpu/drm/nouveau/include/nvif/list.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. INIT_LIST_HEAD
  2. __list_add
  3. list_add
  4. list_add_tail
  5. __list_del
  6. list_del
  7. list_del_init
  8. list_move_tail
  9. list_empty

   1 /*
   2  * Copyright © 2010 Intel Corporation
   3  * Copyright © 2010 Francisco Jerez <currojerez@riseup.net>
   4  *
   5  * Permission is hereby granted, free of charge, to any person obtaining a
   6  * copy of this software and associated documentation files (the "Software"),
   7  * to deal in the Software without restriction, including without limitation
   8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   9  * and/or sell copies of the Software, and to permit persons to whom the
  10  * Software is furnished to do so, subject to the following conditions:
  11  *
  12  * The above copyright notice and this permission notice (including the next
  13  * paragraph) shall be included in all copies or substantial portions of the
  14  * Software.
  15  *
  16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  22  * IN THE SOFTWARE.
  23  *
  24  */
  25 
  26 /* Modified by Ben Skeggs <bskeggs@redhat.com> to match kernel list APIs */
  27 
  28 #ifndef _XORG_LIST_H_
  29 #define _XORG_LIST_H_
  30 
  31 /**
  32  * @file Classic doubly-link circular list implementation.
  33  * For real usage examples of the linked list, see the file test/list.c
  34  *
  35  * Example:
  36  * We need to keep a list of struct foo in the parent struct bar, i.e. what
  37  * we want is something like this.
  38  *
  39  *     struct bar {
  40  *          ...
  41  *          struct foo *list_of_foos; -----> struct foo {}, struct foo {}, struct foo{}
  42  *          ...
  43  *     }
  44  *
  45  * We need one list head in bar and a list element in all list_of_foos (both are of
  46  * data type 'struct list_head').
  47  *
  48  *     struct bar {
  49  *          ...
  50  *          struct list_head list_of_foos;
  51  *          ...
  52  *     }
  53  *
  54  *     struct foo {
  55  *          ...
  56  *          struct list_head entry;
  57  *          ...
  58  *     }
  59  *
  60  * Now we initialize the list head:
  61  *
  62  *     struct bar bar;
  63  *     ...
  64  *     INIT_LIST_HEAD(&bar.list_of_foos);
  65  *
  66  * Then we create the first element and add it to this list:
  67  *
  68  *     struct foo *foo = malloc(...);
  69  *     ....
  70  *     list_add(&foo->entry, &bar.list_of_foos);
  71  *
  72  * Repeat the above for each element you want to add to the list. Deleting
  73  * works with the element itself.
  74  *      list_del(&foo->entry);
  75  *      free(foo);
  76  *
  77  * Note: calling list_del(&bar.list_of_foos) will set bar.list_of_foos to an empty
  78  * list again.
  79  *
  80  * Looping through the list requires a 'struct foo' as iterator and the
  81  * name of the field the subnodes use.
  82  *
  83  * struct foo *iterator;
  84  * list_for_each_entry(iterator, &bar.list_of_foos, entry) {
  85  *      if (iterator->something == ...)
  86  *             ...
  87  * }
  88  *
  89  * Note: You must not call list_del() on the iterator if you continue the
  90  * loop. You need to run the safe for-each loop instead:
  91  *
  92  * struct foo *iterator, *next;
  93  * list_for_each_entry_safe(iterator, next, &bar.list_of_foos, entry) {
  94  *      if (...)
  95  *              list_del(&iterator->entry);
  96  * }
  97  *
  98  */
  99 
 100 /**
 101  * The linkage struct for list nodes. This struct must be part of your
 102  * to-be-linked struct. struct list_head is required for both the head of the
 103  * list and for each list node.
 104  *
 105  * Position and name of the struct list_head field is irrelevant.
 106  * There are no requirements that elements of a list are of the same type.
 107  * There are no requirements for a list head, any struct list_head can be a list
 108  * head.
 109  */
 110 struct list_head {
 111     struct list_head *next, *prev;
 112 };
 113 
 114 /**
 115  * Initialize the list as an empty list.
 116  *
 117  * Example:
 118  * INIT_LIST_HEAD(&bar->list_of_foos);
 119  *
 120  * @param The list to initialized.
 121  */
 122 #define LIST_HEAD_INIT(name) { &(name), &(name) }
 123 
 124 #define LIST_HEAD(name) \
 125         struct list_head name = LIST_HEAD_INIT(name)
 126 
 127 static inline void
 128 INIT_LIST_HEAD(struct list_head *list)
 129 {
 130     list->next = list->prev = list;
 131 }
 132 
 133 static inline void
 134 __list_add(struct list_head *entry,
 135                 struct list_head *prev, struct list_head *next)
 136 {
 137     next->prev = entry;
 138     entry->next = next;
 139     entry->prev = prev;
 140     prev->next = entry;
 141 }
 142 
 143 /**
 144  * Insert a new element after the given list head. The new element does not
 145  * need to be initialised as empty list.
 146  * The list changes from:
 147  *      head → some element → ...
 148  * to
 149  *      head → new element → older element → ...
 150  *
 151  * Example:
 152  * struct foo *newfoo = malloc(...);
 153  * list_add(&newfoo->entry, &bar->list_of_foos);
 154  *
 155  * @param entry The new element to prepend to the list.
 156  * @param head The existing list.
 157  */
 158 static inline void
 159 list_add(struct list_head *entry, struct list_head *head)
 160 {
 161     __list_add(entry, head, head->next);
 162 }
 163 
 164 /**
 165  * Append a new element to the end of the list given with this list head.
 166  *
 167  * The list changes from:
 168  *      head → some element → ... → lastelement
 169  * to
 170  *      head → some element → ... → lastelement → new element
 171  *
 172  * Example:
 173  * struct foo *newfoo = malloc(...);
 174  * list_add_tail(&newfoo->entry, &bar->list_of_foos);
 175  *
 176  * @param entry The new element to prepend to the list.
 177  * @param head The existing list.
 178  */
 179 static inline void
 180 list_add_tail(struct list_head *entry, struct list_head *head)
 181 {
 182     __list_add(entry, head->prev, head);
 183 }
 184 
 185 static inline void
 186 __list_del(struct list_head *prev, struct list_head *next)
 187 {
 188     next->prev = prev;
 189     prev->next = next;
 190 }
 191 
 192 /**
 193  * Remove the element from the list it is in. Using this function will reset
 194  * the pointers to/from this element so it is removed from the list. It does
 195  * NOT free the element itself or manipulate it otherwise.
 196  *
 197  * Using list_del on a pure list head (like in the example at the top of
 198  * this file) will NOT remove the first element from
 199  * the list but rather reset the list as empty list.
 200  *
 201  * Example:
 202  * list_del(&foo->entry);
 203  *
 204  * @param entry The element to remove.
 205  */
 206 static inline void
 207 list_del(struct list_head *entry)
 208 {
 209     __list_del(entry->prev, entry->next);
 210 }
 211 
 212 static inline void
 213 list_del_init(struct list_head *entry)
 214 {
 215     __list_del(entry->prev, entry->next);
 216     INIT_LIST_HEAD(entry);
 217 }
 218 
 219 static inline void list_move_tail(struct list_head *list,
 220                                   struct list_head *head)
 221 {
 222         __list_del(list->prev, list->next);
 223         list_add_tail(list, head);
 224 }
 225 
 226 /**
 227  * Check if the list is empty.
 228  *
 229  * Example:
 230  * list_empty(&bar->list_of_foos);
 231  *
 232  * @return True if the list contains one or more elements or False otherwise.
 233  */
 234 static inline bool
 235 list_empty(struct list_head *head)
 236 {
 237     return head->next == head;
 238 }
 239 
 240 /**
 241  * Returns a pointer to the container of this list element.
 242  *
 243  * Example:
 244  * struct foo* f;
 245  * f = container_of(&foo->entry, struct foo, entry);
 246  * assert(f == foo);
 247  *
 248  * @param ptr Pointer to the struct list_head.
 249  * @param type Data type of the list element.
 250  * @param member Member name of the struct list_head field in the list element.
 251  * @return A pointer to the data struct containing the list head.
 252  */
 253 #ifndef container_of
 254 #define container_of(ptr, type, member) \
 255     (type *)((char *)(ptr) - (char *) &((type *)0)->member)
 256 #endif
 257 
 258 /**
 259  * Alias of container_of
 260  */
 261 #define list_entry(ptr, type, member) \
 262     container_of(ptr, type, member)
 263 
 264 /**
 265  * Retrieve the first list entry for the given list pointer.
 266  *
 267  * Example:
 268  * struct foo *first;
 269  * first = list_first_entry(&bar->list_of_foos, struct foo, list_of_foos);
 270  *
 271  * @param ptr The list head
 272  * @param type Data type of the list element to retrieve
 273  * @param member Member name of the struct list_head field in the list element.
 274  * @return A pointer to the first list element.
 275  */
 276 #define list_first_entry(ptr, type, member) \
 277     list_entry((ptr)->next, type, member)
 278 
 279 /**
 280  * Retrieve the last list entry for the given listpointer.
 281  *
 282  * Example:
 283  * struct foo *first;
 284  * first = list_last_entry(&bar->list_of_foos, struct foo, list_of_foos);
 285  *
 286  * @param ptr The list head
 287  * @param type Data type of the list element to retrieve
 288  * @param member Member name of the struct list_head field in the list element.
 289  * @return A pointer to the last list element.
 290  */
 291 #define list_last_entry(ptr, type, member) \
 292     list_entry((ptr)->prev, type, member)
 293 
 294 #define __container_of(ptr, sample, member)                             \
 295     (void *)container_of((ptr), typeof(*(sample)), member)
 296 
 297 /**
 298  * Loop through the list given by head and set pos to struct in the list.
 299  *
 300  * Example:
 301  * struct foo *iterator;
 302  * list_for_each_entry(iterator, &bar->list_of_foos, entry) {
 303  *      [modify iterator]
 304  * }
 305  *
 306  * This macro is not safe for node deletion. Use list_for_each_entry_safe
 307  * instead.
 308  *
 309  * @param pos Iterator variable of the type of the list elements.
 310  * @param head List head
 311  * @param member Member name of the struct list_head in the list elements.
 312  *
 313  */
 314 #define list_for_each_entry(pos, head, member)                          \
 315     for (pos = __container_of((head)->next, pos, member);               \
 316          &pos->member != (head);                                        \
 317          pos = __container_of(pos->member.next, pos, member))
 318 
 319 /**
 320  * Loop through the list, keeping a backup pointer to the element. This
 321  * macro allows for the deletion of a list element while looping through the
 322  * list.
 323  *
 324  * See list_for_each_entry for more details.
 325  */
 326 #define list_for_each_entry_safe(pos, tmp, head, member)                \
 327     for (pos = __container_of((head)->next, pos, member),               \
 328          tmp = __container_of(pos->member.next, pos, member);           \
 329          &pos->member != (head);                                        \
 330          pos = tmp, tmp = __container_of(pos->member.next, tmp, member))
 331 
 332 
 333 #define list_for_each_entry_reverse(pos, head, member)                  \
 334         for (pos = __container_of((head)->prev, pos, member);           \
 335              &pos->member != (head);                                    \
 336              pos = __container_of(pos->member.prev, pos, member))
 337 
 338 #define list_for_each_entry_continue(pos, head, member)                 \
 339         for (pos = __container_of(pos->member.next, pos, member);       \
 340              &pos->member != (head);                                    \
 341              pos = __container_of(pos->member.next, pos, member))
 342 
 343 #define list_for_each_entry_continue_reverse(pos, head, member)         \
 344         for (pos = __container_of(pos->member.prev, pos, member);       \
 345              &pos->member != (head);                                    \
 346              pos = __container_of(pos->member.prev, pos, member))
 347 
 348 #define list_for_each_entry_from(pos, head, member)                     \
 349         for (;                                                          \
 350              &pos->member != (head);                                    \
 351              pos = __container_of(pos->member.next, pos, member))
 352 
 353 #endif

/* [<][>][^][v][top][bottom][index][help] */