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