/* * Copyright (C) 2002 Free Software Foundation, Inc. * (originally part of the GNU C Library and Userspace RCU) * Contributed by Ulrich Drepper <[email protected]>, 2002. * * Copyright (C) 2009 Pierre-Marc Fournier * Conversion to RCU list. * Copyright (C) 2010 Mathieu Desnoyers <[email protected]> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, see * <https://www.gnu.org/licenses/>. */ #ifndef LIST_H #define LIST_H … /* * The definitions of this file are adopted from those which can be * found in the Linux kernel headers to enable people familiar with the * latter find their way in these sources as well. */ /* Basic type for the double-link list. */ struct list_head { … }; /* avoid conflicts with BSD-only sys/queue.h */ #undef LIST_HEAD /* Define a variable with the head and tail of the list. */ #define LIST_HEAD(name) … /* Initialize a new list head. */ #define INIT_LIST_HEAD(ptr) … #define LIST_HEAD_INIT(name) … /* Add new element at the head of the list. */ static inline void list_add(struct list_head *newp, struct list_head *head) { … } /* Add new element at the tail of the list. */ static inline void list_add_tail(struct list_head *newp, struct list_head *head) { … } /* Remove element from list. */ static inline void __list_del(struct list_head *prev, struct list_head *next) { … } /* Remove element from list. */ static inline void list_del(struct list_head *elem) { … } /* Remove element from list, initializing the element's list pointers. */ static inline void list_del_init(struct list_head *elem) { … } /* Delete from list, add to another list as head. */ static inline void list_move(struct list_head *elem, struct list_head *head) { … } /* Replace an old entry. */ static inline void list_replace(struct list_head *old, struct list_head *newp) { … } /* Join two lists. */ static inline void list_splice(struct list_head *add, struct list_head *head) { … } /* Get typed element from list at a given position. */ #define list_entry(ptr, type, member) … /* Get first entry from a list. */ #define list_first_entry(ptr, type, member) … /* Iterate forward over the elements of the list. */ #define list_for_each(pos, head) … /* * Iterate forward over the elements list. The list elements can be * removed from the list while doing this. */ #define list_for_each_safe(pos, p, head) … /* Iterate backward over the elements of the list. */ #define list_for_each_prev(pos, head) … /* * Iterate backwards over the elements list. The list elements can be * removed from the list while doing this. */ #define list_for_each_prev_safe(pos, p, head) … static inline int list_empty(struct list_head *head) { … } static inline void list_replace_init(struct list_head *old, struct list_head *newp) { … } /* * This is exactly the same as a normal list_head, except that it can be * declared volatile (e.g., if you have a list that may be accessed from signal * handlers). */ struct volatile_list_head { … }; #define VOLATILE_LIST_HEAD(name) … static inline void __volatile_list_del(volatile struct volatile_list_head *prev, volatile struct volatile_list_head *next) { … } static inline void volatile_list_del(volatile struct volatile_list_head *elem) { … } static inline int volatile_list_empty(volatile struct volatile_list_head *head) { … } static inline void volatile_list_add(volatile struct volatile_list_head *newp, volatile struct volatile_list_head *head) { … } #endif /* LIST_H */