From ee9dd1a54ab16b7be97317c38dd3cf50f6ece5eb Mon Sep 17 00:00:00 2001 From: Anas Nashif Date: Wed, 26 Jun 2019 10:33:41 -0400 Subject: [PATCH] cleanup: include/: move misc/dlist.h to sys/dlist.h move misc/dlist.h to sys/dlist.h and create a shim for backward-compatibility. No functional changes to the headers. A warning in the shim can be controlled with CONFIG_COMPAT_INCLUDES. Related to #16539 Signed-off-by: Anas Nashif --- arch/arc/include/kernel_arch_data.h | 2 +- arch/arm/include/kernel_arch_data.h | 2 +- arch/nios2/include/kernel_arch_data.h | 2 +- arch/riscv32/include/kernel_arch_data.h | 2 +- arch/x86/include/kernel_arch_data.h | 2 +- arch/xtensa/include/kernel_arch_data.h | 2 +- include/app_memory/app_memdomain.h | 2 +- include/disk/disk_access.h | 2 +- include/fs/fs.h | 2 +- include/kernel_includes.h | 2 +- include/misc/dlist.h | 547 +---------------- include/sched_priq.h | 2 +- include/shell/shell_history.h | 2 +- include/sys/dlist.h | 554 ++++++++++++++++++ include/sys_clock.h | 2 +- kernel/include/kernel_structs.h | 2 +- kernel/include/wait_q.h | 2 +- kernel/init.c | 2 +- kernel/mailbox.c | 2 +- kernel/mem_slab.c | 2 +- kernel/msg_q.c | 2 +- kernel/mutex.c | 2 +- kernel/pipes.c | 2 +- kernel/poll.c | 2 +- kernel/sem.c | 2 +- .../controller/ll_sw/nordic/hal/nrf5/cntr.c | 2 +- .../controller/ll_sw/nordic/hal/nrf5/ecb.c | 2 +- .../ll_sw/nordic/hal/nrf5/radio/radio.c | 2 +- .../controller/ll_sw/nordic/hal/nrf5/ticker.c | 2 +- tests/kernel/common/src/dlist.c | 2 +- 30 files changed, 586 insertions(+), 571 deletions(-) create mode 100644 include/sys/dlist.h diff --git a/arch/arc/include/kernel_arch_data.h b/arch/arc/include/kernel_arch_data.h index 98950803319..9d17907e896 100644 --- a/arch/arc/include/kernel_arch_data.h +++ b/arch/arc/include/kernel_arch_data.h @@ -35,7 +35,7 @@ extern "C" { #include #include #include -#include +#include #endif #ifndef _ASMLANGUAGE diff --git a/arch/arm/include/kernel_arch_data.h b/arch/arm/include/kernel_arch_data.h index 3f570984bb4..f025bcd1747 100644 --- a/arch/arm/include/kernel_arch_data.h +++ b/arch/arm/include/kernel_arch_data.h @@ -33,7 +33,7 @@ extern "C" { #include #include #include -#include +#include #include #endif diff --git a/arch/nios2/include/kernel_arch_data.h b/arch/nios2/include/kernel_arch_data.h index c4fed91e57b..d7a085cb56d 100644 --- a/arch/nios2/include/kernel_arch_data.h +++ b/arch/nios2/include/kernel_arch_data.h @@ -35,7 +35,7 @@ extern "C" { #include #include #include -#include +#include #endif /* stacks */ diff --git a/arch/riscv32/include/kernel_arch_data.h b/arch/riscv32/include/kernel_arch_data.h index ffacc4fe511..8768e90ca52 100644 --- a/arch/riscv32/include/kernel_arch_data.h +++ b/arch/riscv32/include/kernel_arch_data.h @@ -28,7 +28,7 @@ extern "C" { #include #include #include -#include +#include #include extern K_THREAD_STACK_DEFINE(_interrupt_stack, CONFIG_ISR_STACK_SIZE); diff --git a/arch/x86/include/kernel_arch_data.h b/arch/x86/include/kernel_arch_data.h index e86220efc3e..ebb3df1e101 100644 --- a/arch/x86/include/kernel_arch_data.h +++ b/arch/x86/include/kernel_arch_data.h @@ -37,7 +37,7 @@ #include #include #include -#include +#include #endif /* Some configurations require that the stack/registers be adjusted before diff --git a/arch/xtensa/include/kernel_arch_data.h b/arch/xtensa/include/kernel_arch_data.h index 636ec1d6521..3f078ccab07 100644 --- a/arch/xtensa/include/kernel_arch_data.h +++ b/arch/xtensa/include/kernel_arch_data.h @@ -33,7 +33,7 @@ extern "C" { #include /* public kernel API */ #include #include -#include +#include #include /* Bitmask definitions for the struct k_thread->flags bit field */ diff --git a/include/app_memory/app_memdomain.h b/include/app_memory/app_memdomain.h index 524e840d78c..c429c285e4c 100644 --- a/include/app_memory/app_memdomain.h +++ b/include/app_memory/app_memdomain.h @@ -7,7 +7,7 @@ #define ZEPHYR_INCLUDE_APP_MEMORY_APP_MEMDOMAIN_H_ #include -#include +#include #include #ifdef CONFIG_USERSPACE diff --git a/include/disk/disk_access.h b/include/disk/disk_access.h index 4156ddff930..81a45982df9 100644 --- a/include/disk/disk_access.h +++ b/include/disk/disk_access.h @@ -19,7 +19,7 @@ #include #include -#include +#include #ifdef __cplusplus extern "C" { diff --git a/include/fs/fs.h b/include/fs/fs.h index a7bec43769e..d8157445f8c 100644 --- a/include/fs/fs.h +++ b/include/fs/fs.h @@ -26,7 +26,7 @@ typedef long long int off_t; #include #endif -#include +#include #include #ifdef __cplusplus diff --git a/include/kernel_includes.h b/include/kernel_includes.h index 5d62acee21e..100f2f59497 100644 --- a/include/kernel_includes.h +++ b/include/kernel_includes.h @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/include/misc/dlist.h b/include/misc/dlist.h index dab55dddf79..2d5f91902e2 100644 --- a/include/misc/dlist.h +++ b/include/misc/dlist.h @@ -1,554 +1,15 @@ /* - * Copyright (c) 2013-2015 Wind River Systems, Inc. + * Copyright (c) 2019 Intel Corporation * * SPDX-License-Identifier: Apache-2.0 */ - -/** - * @file - * @brief Doubly-linked list implementation - * - * Doubly-linked list implementation using inline macros/functions. - * This API is not thread safe, and thus if a list is used across threads, - * calls to functions must be protected with synchronization primitives. - * - * The lists are expected to be initialized such that both the head and tail - * pointers point to the list itself. Initializing the lists in such a fashion - * simplifies the adding and removing of nodes to/from the list. - */ - #ifndef ZEPHYR_INCLUDE_MISC_DLIST_H_ #define ZEPHYR_INCLUDE_MISC_DLIST_H_ -#include -#include -#include - -#ifdef __cplusplus -extern "C" { +#ifndef CONFIG_COMPAT_INCLUDES +#warning "This header file has moved, include instead." #endif -struct _dnode { - union { - struct _dnode *head; /* ptr to head of list (sys_dlist_t) */ - struct _dnode *next; /* ptr to next node (sys_dnode_t) */ - }; - union { - struct _dnode *tail; /* ptr to tail of list (sys_dlist_t) */ - struct _dnode *prev; /* ptr to previous node (sys_dnode_t) */ - }; -}; - -typedef struct _dnode sys_dlist_t; -typedef struct _dnode sys_dnode_t; - -/** - * @brief Provide the primitive to iterate on a list - * Note: the loop is unsafe and thus __dn should not be removed - * - * User _MUST_ add the loop statement curly braces enclosing its own code: - * - * SYS_DLIST_FOR_EACH_NODE(l, n) { - * - * } - * - * This and other SYS_DLIST_*() macros are not thread safe. - * - * @param __dl A pointer on a sys_dlist_t to iterate on - * @param __dn A sys_dnode_t pointer to peek each node of the list - */ -#define SYS_DLIST_FOR_EACH_NODE(__dl, __dn) \ - for (__dn = sys_dlist_peek_head(__dl); __dn != NULL; \ - __dn = sys_dlist_peek_next(__dl, __dn)) - -/** - * @brief Provide the primitive to iterate on a list, from a node in the list - * Note: the loop is unsafe and thus __dn should not be removed - * - * User _MUST_ add the loop statement curly braces enclosing its own code: - * - * SYS_DLIST_ITERATE_FROM_NODE(l, n) { - * - * } - * - * Like SYS_DLIST_FOR_EACH_NODE(), but __dn already contains a node in the list - * where to start searching for the next entry from. If NULL, it starts from - * the head. - * - * This and other SYS_DLIST_*() macros are not thread safe. - * - * @param __dl A pointer on a sys_dlist_t to iterate on - * @param __dn A sys_dnode_t pointer to peek each node of the list; - * it contains the starting node, or NULL to start from the head - */ -#define SYS_DLIST_ITERATE_FROM_NODE(__dl, __dn) \ - for (__dn = __dn ? sys_dlist_peek_next_no_check(__dl, __dn) \ - : sys_dlist_peek_head(__dl); \ - __dn != NULL; \ - __dn = sys_dlist_peek_next(__dl, __dn)) - -/** - * @brief Provide the primitive to safely iterate on a list - * Note: __dn can be removed, it will not break the loop. - * - * User _MUST_ add the loop statement curly braces enclosing its own code: - * - * SYS_DLIST_FOR_EACH_NODE_SAFE(l, n, s) { - * - * } - * - * This and other SYS_DLIST_*() macros are not thread safe. - * - * @param __dl A pointer on a sys_dlist_t to iterate on - * @param __dn A sys_dnode_t pointer to peek each node of the list - * @param __dns A sys_dnode_t pointer for the loop to run safely - */ -#define SYS_DLIST_FOR_EACH_NODE_SAFE(__dl, __dn, __dns) \ - for (__dn = sys_dlist_peek_head(__dl), \ - __dns = sys_dlist_peek_next(__dl, __dn); \ - __dn != NULL; __dn = __dns, \ - __dns = sys_dlist_peek_next(__dl, __dn)) - -/* - * @brief Provide the primitive to resolve the container of a list node - * Note: it is safe to use with NULL pointer nodes - * - * @param __dn A pointer on a sys_dnode_t to get its container - * @param __cn Container struct type pointer - * @param __n The field name of sys_dnode_t within the container struct - */ -#define SYS_DLIST_CONTAINER(__dn, __cn, __n) \ - ((__dn != NULL) ? CONTAINER_OF(__dn, __typeof__(*__cn), __n) : NULL) -/* - * @brief Provide the primitive to peek container of the list head - * - * @param __dl A pointer on a sys_dlist_t to peek - * @param __cn Container struct type pointer - * @param __n The field name of sys_dnode_t within the container struct - */ -#define SYS_DLIST_PEEK_HEAD_CONTAINER(__dl, __cn, __n) \ - SYS_DLIST_CONTAINER(sys_dlist_peek_head(__dl), __cn, __n) - -/* - * @brief Provide the primitive to peek the next container - * - * @param __dl A pointer on a sys_dlist_t to peek - * @param __cn Container struct type pointer - * @param __n The field name of sys_dnode_t within the container struct - */ -#define SYS_DLIST_PEEK_NEXT_CONTAINER(__dl, __cn, __n) \ - ((__cn != NULL) ? \ - SYS_DLIST_CONTAINER(sys_dlist_peek_next(__dl, &(__cn->__n)), \ - __cn, __n) : NULL) - -/** - * @brief Provide the primitive to iterate on a list under a container - * Note: the loop is unsafe and thus __cn should not be detached - * - * User _MUST_ add the loop statement curly braces enclosing its own code: - * - * SYS_DLIST_FOR_EACH_CONTAINER(l, c, n) { - * - * } - * - * @param __dl A pointer on a sys_dlist_t to iterate on - * @param __cn A pointer to peek each entry of the list - * @param __n The field name of sys_dnode_t within the container struct - */ -#define SYS_DLIST_FOR_EACH_CONTAINER(__dl, __cn, __n) \ - for (__cn = SYS_DLIST_PEEK_HEAD_CONTAINER(__dl, __cn, __n); \ - __cn != NULL; \ - __cn = SYS_DLIST_PEEK_NEXT_CONTAINER(__dl, __cn, __n)) - -/** - * @brief Provide the primitive to safely iterate on a list under a container - * Note: __cn can be detached, it will not break the loop. - * - * User _MUST_ add the loop statement curly braces enclosing its own code: - * - * SYS_DLIST_FOR_EACH_CONTAINER_SAFE(l, c, cn, n) { - * - * } - * - * @param __dl A pointer on a sys_dlist_t to iterate on - * @param __cn A pointer to peek each entry of the list - * @param __cns A pointer for the loop to run safely - * @param __n The field name of sys_dnode_t within the container struct - */ -#define SYS_DLIST_FOR_EACH_CONTAINER_SAFE(__dl, __cn, __cns, __n) \ - for (__cn = SYS_DLIST_PEEK_HEAD_CONTAINER(__dl, __cn, __n), \ - __cns = SYS_DLIST_PEEK_NEXT_CONTAINER(__dl, __cn, __n); \ - __cn != NULL; __cn = __cns, \ - __cns = SYS_DLIST_PEEK_NEXT_CONTAINER(__dl, __cn, __n)) - -/** - * @brief initialize list to its empty state - * - * @param list the doubly-linked list - * - * @return N/A - */ - -static inline void sys_dlist_init(sys_dlist_t *list) -{ - list->head = (sys_dnode_t *)list; - list->tail = (sys_dnode_t *)list; -} - -#define SYS_DLIST_STATIC_INIT(ptr_to_list) { {(ptr_to_list)}, {(ptr_to_list)} } - -/** - * @brief initialize node to its state when not in a list - * - * @param node the node - * - * @return N/A - */ - -static inline void sys_dnode_init(sys_dnode_t *node) -{ - node->next = NULL; - node->prev = NULL; -} - -/** - * @brief check if a node is a member of any list - * - * @param node the node - * - * @return true if node is linked into a list, false if it is not - */ - -static inline bool sys_dnode_is_linked(const sys_dnode_t *node) -{ - return node->next != NULL; -} - -/** - * @brief check if a node is the list's head - * - * @param list the doubly-linked list to operate on - * @param node the node to check - * - * @return true if node is the head, false otherwise - */ - -static inline bool sys_dlist_is_head(sys_dlist_t *list, sys_dnode_t *node) -{ - return list->head == node; -} - -/** - * @brief check if a node is the list's tail - * - * @param list the doubly-linked list to operate on - * @param node the node to check - * - * @return true if node is the tail, false otherwise - */ - -static inline bool sys_dlist_is_tail(sys_dlist_t *list, sys_dnode_t *node) -{ - return list->tail == node; -} - -/** - * @brief check if the list is empty - * - * @param list the doubly-linked list to operate on - * - * @return true if empty, false otherwise - */ - -static inline bool sys_dlist_is_empty(sys_dlist_t *list) -{ - return list->head == list; -} - -/** - * @brief check if more than one node present - * - * This and other sys_dlist_*() functions are not thread safe. - * - * @param list the doubly-linked list to operate on - * - * @return true if multiple nodes, false otherwise - */ - -static inline bool sys_dlist_has_multiple_nodes(sys_dlist_t *list) -{ - return list->head != list->tail; -} - -/** - * @brief get a reference to the head item in the list - * - * @param list the doubly-linked list to operate on - * - * @return a pointer to the head element, NULL if list is empty - */ - -static inline sys_dnode_t *sys_dlist_peek_head(sys_dlist_t *list) -{ - return sys_dlist_is_empty(list) ? NULL : list->head; -} - -/** - * @brief get a reference to the head item in the list - * - * The list must be known to be non-empty. - * - * @param list the doubly-linked list to operate on - * - * @return a pointer to the head element - */ - -static inline sys_dnode_t *sys_dlist_peek_head_not_empty(sys_dlist_t *list) -{ - return list->head; -} - -/** - * @brief get a reference to the next item in the list, node is not NULL - * - * Faster than sys_dlist_peek_next() if node is known not to be NULL. - * - * @param list the doubly-linked list to operate on - * @param node the node from which to get the next element in the list - * - * @return a pointer to the next element from a node, NULL if node is the tail - */ - -static inline sys_dnode_t *sys_dlist_peek_next_no_check(sys_dlist_t *list, - sys_dnode_t *node) -{ - return (node == list->tail) ? NULL : node->next; -} - -/** - * @brief get a reference to the next item in the list - * - * @param list the doubly-linked list to operate on - * @param node the node from which to get the next element in the list - * - * @return a pointer to the next element from a node, NULL if node is the tail - * or NULL (when node comes from reading the head of an empty list). - */ - -static inline sys_dnode_t *sys_dlist_peek_next(sys_dlist_t *list, - sys_dnode_t *node) -{ - return (node != NULL) ? sys_dlist_peek_next_no_check(list, node) : NULL; -} - -/** - * @brief get a reference to the previous item in the list, node is not NULL - * - * Faster than sys_dlist_peek_prev() if node is known not to be NULL. - * - * @param list the doubly-linked list to operate on - * @param node the node from which to get the previous element in the list - * - * @return a pointer to the previous element from a node, NULL if node is the - * tail - */ - -static inline sys_dnode_t *sys_dlist_peek_prev_no_check(sys_dlist_t *list, - sys_dnode_t *node) -{ - return (node == list->head) ? NULL : node->prev; -} - -/** - * @brief get a reference to the previous item in the list - * - * @param list the doubly-linked list to operate on - * @param node the node from which to get the previous element in the list - * - * @return a pointer to the previous element from a node, NULL if node is the - * tail or NULL (when node comes from reading the head of an empty - * list). - */ - -static inline sys_dnode_t *sys_dlist_peek_prev(sys_dlist_t *list, - sys_dnode_t *node) -{ - return (node != NULL) ? sys_dlist_peek_prev_no_check(list, node) : NULL; -} - -/** - * @brief get a reference to the tail item in the list - * - * @param list the doubly-linked list to operate on - * - * @return a pointer to the tail element, NULL if list is empty - */ - -static inline sys_dnode_t *sys_dlist_peek_tail(sys_dlist_t *list) -{ - return sys_dlist_is_empty(list) ? NULL : list->tail; -} - -/** - * @brief add node to tail of list - * - * This and other sys_dlist_*() functions are not thread safe. - * - * @param list the doubly-linked list to operate on - * @param node the element to append - * - * @return N/A - */ - -static inline void sys_dlist_append(sys_dlist_t *list, sys_dnode_t *node) -{ - node->next = list; - node->prev = list->tail; - - list->tail->next = node; - list->tail = node; -} - -/** - * @brief add node to head of list - * - * This and other sys_dlist_*() functions are not thread safe. - * - * @param list the doubly-linked list to operate on - * @param node the element to append - * - * @return N/A - */ - -static inline void sys_dlist_prepend(sys_dlist_t *list, sys_dnode_t *node) -{ - node->next = list->head; - node->prev = list; - - list->head->prev = node; - list->head = node; -} - -/** - * @brief Insert a node into a list - * - * Insert a node before a specified node in a dlist. - * - * @param successor the position before which "node" will be inserted - * @param node the element to insert - */ -static inline void sys_dlist_insert(sys_dnode_t *successor, sys_dnode_t *node) -{ - node->prev = successor->prev; - node->next = successor; - successor->prev->next = node; - successor->prev = node; -} - -static inline void __deprecated sys_dlist_insert_after(sys_dlist_t *list, - sys_dnode_t *insert_point, sys_dnode_t *node) -{ - if (insert_point == NULL) { - sys_dlist_prepend(list, node); - } else { - node->next = insert_point->next; - node->prev = insert_point; - insert_point->next->prev = node; - insert_point->next = node; - } -} - -static inline void __deprecated sys_dlist_insert_before(sys_dlist_t *list, - sys_dnode_t *insert_point, sys_dnode_t *node) -{ - if (insert_point == NULL) { - sys_dlist_append(list, node); - } else { - node->prev = insert_point->prev; - node->next = insert_point; - insert_point->prev->next = node; - insert_point->prev = node; - } -} - -/** - * @brief insert node at position - * - * Insert a node in a location depending on a external condition. The cond() - * function checks if the node is to be inserted _before_ the current node - * against which it is checked. - * This and other sys_dlist_*() functions are not thread safe. - * - * @param list the doubly-linked list to operate on - * @param node the element to insert - * @param cond a function that determines if the current node is the correct - * insert point - * @param data parameter to cond() - * - * @return N/A - */ - -static inline void sys_dlist_insert_at(sys_dlist_t *list, sys_dnode_t *node, - int (*cond)(sys_dnode_t *node, void *data), void *data) -{ - if (sys_dlist_is_empty(list)) { - sys_dlist_append(list, node); - } else { - sys_dnode_t *pos = sys_dlist_peek_head(list); - - while ((pos != NULL) && (cond(pos, data) == 0)) { - pos = sys_dlist_peek_next(list, pos); - } - if (pos != NULL) { - sys_dlist_insert(pos, node); - } else { - sys_dlist_append(list, node); - } - } -} - -/** - * @brief remove a specific node from a list - * - * The list is implicit from the node. The node must be part of a list. - * This and other sys_dlist_*() functions are not thread safe. - * - * @param node the node to remove - * - * @return N/A - */ - -static inline void sys_dlist_remove(sys_dnode_t *node) -{ - node->prev->next = node->next; - node->next->prev = node->prev; - sys_dnode_init(node); -} - -/** - * @brief get the first node in a list - * - * This and other sys_dlist_*() functions are not thread safe. - * - * @param list the doubly-linked list to operate on - * - * @return the first node in the list, NULL if list is empty - */ - -static inline sys_dnode_t *sys_dlist_get(sys_dlist_t *list) -{ - sys_dnode_t *node = NULL; - - if (!sys_dlist_is_empty(list)) { - node = list->head; - sys_dlist_remove(node); - } - - return node; -} - -#ifdef __cplusplus -} -#endif +#include #endif /* ZEPHYR_INCLUDE_MISC_DLIST_H_ */ diff --git a/include/sched_priq.h b/include/sched_priq.h index a8b3922864b..38591c21a0b 100644 --- a/include/sched_priq.h +++ b/include/sched_priq.h @@ -7,7 +7,7 @@ #define ZEPHYR_INCLUDE_SCHED_PRIQ_H_ #include -#include +#include #include /* Two abstractions are defined here for "thread priority queues". diff --git a/include/shell/shell_history.h b/include/shell/shell_history.h index 8e3b1e5d6d7..3a76771fca0 100644 --- a/include/shell/shell_history.h +++ b/include/shell/shell_history.h @@ -9,7 +9,7 @@ #include #include -#include +#include #include #include diff --git a/include/sys/dlist.h b/include/sys/dlist.h new file mode 100644 index 00000000000..3a72f2499a0 --- /dev/null +++ b/include/sys/dlist.h @@ -0,0 +1,554 @@ +/* + * Copyright (c) 2013-2015 Wind River Systems, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief Doubly-linked list implementation + * + * Doubly-linked list implementation using inline macros/functions. + * This API is not thread safe, and thus if a list is used across threads, + * calls to functions must be protected with synchronization primitives. + * + * The lists are expected to be initialized such that both the head and tail + * pointers point to the list itself. Initializing the lists in such a fashion + * simplifies the adding and removing of nodes to/from the list. + */ + +#ifndef ZEPHYR_INCLUDE_SYS_DLIST_H_ +#define ZEPHYR_INCLUDE_SYS_DLIST_H_ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct _dnode { + union { + struct _dnode *head; /* ptr to head of list (sys_dlist_t) */ + struct _dnode *next; /* ptr to next node (sys_dnode_t) */ + }; + union { + struct _dnode *tail; /* ptr to tail of list (sys_dlist_t) */ + struct _dnode *prev; /* ptr to previous node (sys_dnode_t) */ + }; +}; + +typedef struct _dnode sys_dlist_t; +typedef struct _dnode sys_dnode_t; + +/** + * @brief Provide the primitive to iterate on a list + * Note: the loop is unsafe and thus __dn should not be removed + * + * User _MUST_ add the loop statement curly braces enclosing its own code: + * + * SYS_DLIST_FOR_EACH_NODE(l, n) { + * + * } + * + * This and other SYS_DLIST_*() macros are not thread safe. + * + * @param __dl A pointer on a sys_dlist_t to iterate on + * @param __dn A sys_dnode_t pointer to peek each node of the list + */ +#define SYS_DLIST_FOR_EACH_NODE(__dl, __dn) \ + for (__dn = sys_dlist_peek_head(__dl); __dn != NULL; \ + __dn = sys_dlist_peek_next(__dl, __dn)) + +/** + * @brief Provide the primitive to iterate on a list, from a node in the list + * Note: the loop is unsafe and thus __dn should not be removed + * + * User _MUST_ add the loop statement curly braces enclosing its own code: + * + * SYS_DLIST_ITERATE_FROM_NODE(l, n) { + * + * } + * + * Like SYS_DLIST_FOR_EACH_NODE(), but __dn already contains a node in the list + * where to start searching for the next entry from. If NULL, it starts from + * the head. + * + * This and other SYS_DLIST_*() macros are not thread safe. + * + * @param __dl A pointer on a sys_dlist_t to iterate on + * @param __dn A sys_dnode_t pointer to peek each node of the list; + * it contains the starting node, or NULL to start from the head + */ +#define SYS_DLIST_ITERATE_FROM_NODE(__dl, __dn) \ + for (__dn = __dn ? sys_dlist_peek_next_no_check(__dl, __dn) \ + : sys_dlist_peek_head(__dl); \ + __dn != NULL; \ + __dn = sys_dlist_peek_next(__dl, __dn)) + +/** + * @brief Provide the primitive to safely iterate on a list + * Note: __dn can be removed, it will not break the loop. + * + * User _MUST_ add the loop statement curly braces enclosing its own code: + * + * SYS_DLIST_FOR_EACH_NODE_SAFE(l, n, s) { + * + * } + * + * This and other SYS_DLIST_*() macros are not thread safe. + * + * @param __dl A pointer on a sys_dlist_t to iterate on + * @param __dn A sys_dnode_t pointer to peek each node of the list + * @param __dns A sys_dnode_t pointer for the loop to run safely + */ +#define SYS_DLIST_FOR_EACH_NODE_SAFE(__dl, __dn, __dns) \ + for (__dn = sys_dlist_peek_head(__dl), \ + __dns = sys_dlist_peek_next(__dl, __dn); \ + __dn != NULL; __dn = __dns, \ + __dns = sys_dlist_peek_next(__dl, __dn)) + +/* + * @brief Provide the primitive to resolve the container of a list node + * Note: it is safe to use with NULL pointer nodes + * + * @param __dn A pointer on a sys_dnode_t to get its container + * @param __cn Container struct type pointer + * @param __n The field name of sys_dnode_t within the container struct + */ +#define SYS_DLIST_CONTAINER(__dn, __cn, __n) \ + ((__dn != NULL) ? CONTAINER_OF(__dn, __typeof__(*__cn), __n) : NULL) +/* + * @brief Provide the primitive to peek container of the list head + * + * @param __dl A pointer on a sys_dlist_t to peek + * @param __cn Container struct type pointer + * @param __n The field name of sys_dnode_t within the container struct + */ +#define SYS_DLIST_PEEK_HEAD_CONTAINER(__dl, __cn, __n) \ + SYS_DLIST_CONTAINER(sys_dlist_peek_head(__dl), __cn, __n) + +/* + * @brief Provide the primitive to peek the next container + * + * @param __dl A pointer on a sys_dlist_t to peek + * @param __cn Container struct type pointer + * @param __n The field name of sys_dnode_t within the container struct + */ +#define SYS_DLIST_PEEK_NEXT_CONTAINER(__dl, __cn, __n) \ + ((__cn != NULL) ? \ + SYS_DLIST_CONTAINER(sys_dlist_peek_next(__dl, &(__cn->__n)), \ + __cn, __n) : NULL) + +/** + * @brief Provide the primitive to iterate on a list under a container + * Note: the loop is unsafe and thus __cn should not be detached + * + * User _MUST_ add the loop statement curly braces enclosing its own code: + * + * SYS_DLIST_FOR_EACH_CONTAINER(l, c, n) { + * + * } + * + * @param __dl A pointer on a sys_dlist_t to iterate on + * @param __cn A pointer to peek each entry of the list + * @param __n The field name of sys_dnode_t within the container struct + */ +#define SYS_DLIST_FOR_EACH_CONTAINER(__dl, __cn, __n) \ + for (__cn = SYS_DLIST_PEEK_HEAD_CONTAINER(__dl, __cn, __n); \ + __cn != NULL; \ + __cn = SYS_DLIST_PEEK_NEXT_CONTAINER(__dl, __cn, __n)) + +/** + * @brief Provide the primitive to safely iterate on a list under a container + * Note: __cn can be detached, it will not break the loop. + * + * User _MUST_ add the loop statement curly braces enclosing its own code: + * + * SYS_DLIST_FOR_EACH_CONTAINER_SAFE(l, c, cn, n) { + * + * } + * + * @param __dl A pointer on a sys_dlist_t to iterate on + * @param __cn A pointer to peek each entry of the list + * @param __cns A pointer for the loop to run safely + * @param __n The field name of sys_dnode_t within the container struct + */ +#define SYS_DLIST_FOR_EACH_CONTAINER_SAFE(__dl, __cn, __cns, __n) \ + for (__cn = SYS_DLIST_PEEK_HEAD_CONTAINER(__dl, __cn, __n), \ + __cns = SYS_DLIST_PEEK_NEXT_CONTAINER(__dl, __cn, __n); \ + __cn != NULL; __cn = __cns, \ + __cns = SYS_DLIST_PEEK_NEXT_CONTAINER(__dl, __cn, __n)) + +/** + * @brief initialize list to its empty state + * + * @param list the doubly-linked list + * + * @return N/A + */ + +static inline void sys_dlist_init(sys_dlist_t *list) +{ + list->head = (sys_dnode_t *)list; + list->tail = (sys_dnode_t *)list; +} + +#define SYS_DLIST_STATIC_INIT(ptr_to_list) { {(ptr_to_list)}, {(ptr_to_list)} } + +/** + * @brief initialize node to its state when not in a list + * + * @param node the node + * + * @return N/A + */ + +static inline void sys_dnode_init(sys_dnode_t *node) +{ + node->next = NULL; + node->prev = NULL; +} + +/** + * @brief check if a node is a member of any list + * + * @param node the node + * + * @return true if node is linked into a list, false if it is not + */ + +static inline bool sys_dnode_is_linked(const sys_dnode_t *node) +{ + return node->next != NULL; +} + +/** + * @brief check if a node is the list's head + * + * @param list the doubly-linked list to operate on + * @param node the node to check + * + * @return true if node is the head, false otherwise + */ + +static inline bool sys_dlist_is_head(sys_dlist_t *list, sys_dnode_t *node) +{ + return list->head == node; +} + +/** + * @brief check if a node is the list's tail + * + * @param list the doubly-linked list to operate on + * @param node the node to check + * + * @return true if node is the tail, false otherwise + */ + +static inline bool sys_dlist_is_tail(sys_dlist_t *list, sys_dnode_t *node) +{ + return list->tail == node; +} + +/** + * @brief check if the list is empty + * + * @param list the doubly-linked list to operate on + * + * @return true if empty, false otherwise + */ + +static inline bool sys_dlist_is_empty(sys_dlist_t *list) +{ + return list->head == list; +} + +/** + * @brief check if more than one node present + * + * This and other sys_dlist_*() functions are not thread safe. + * + * @param list the doubly-linked list to operate on + * + * @return true if multiple nodes, false otherwise + */ + +static inline bool sys_dlist_has_multiple_nodes(sys_dlist_t *list) +{ + return list->head != list->tail; +} + +/** + * @brief get a reference to the head item in the list + * + * @param list the doubly-linked list to operate on + * + * @return a pointer to the head element, NULL if list is empty + */ + +static inline sys_dnode_t *sys_dlist_peek_head(sys_dlist_t *list) +{ + return sys_dlist_is_empty(list) ? NULL : list->head; +} + +/** + * @brief get a reference to the head item in the list + * + * The list must be known to be non-empty. + * + * @param list the doubly-linked list to operate on + * + * @return a pointer to the head element + */ + +static inline sys_dnode_t *sys_dlist_peek_head_not_empty(sys_dlist_t *list) +{ + return list->head; +} + +/** + * @brief get a reference to the next item in the list, node is not NULL + * + * Faster than sys_dlist_peek_next() if node is known not to be NULL. + * + * @param list the doubly-linked list to operate on + * @param node the node from which to get the next element in the list + * + * @return a pointer to the next element from a node, NULL if node is the tail + */ + +static inline sys_dnode_t *sys_dlist_peek_next_no_check(sys_dlist_t *list, + sys_dnode_t *node) +{ + return (node == list->tail) ? NULL : node->next; +} + +/** + * @brief get a reference to the next item in the list + * + * @param list the doubly-linked list to operate on + * @param node the node from which to get the next element in the list + * + * @return a pointer to the next element from a node, NULL if node is the tail + * or NULL (when node comes from reading the head of an empty list). + */ + +static inline sys_dnode_t *sys_dlist_peek_next(sys_dlist_t *list, + sys_dnode_t *node) +{ + return (node != NULL) ? sys_dlist_peek_next_no_check(list, node) : NULL; +} + +/** + * @brief get a reference to the previous item in the list, node is not NULL + * + * Faster than sys_dlist_peek_prev() if node is known not to be NULL. + * + * @param list the doubly-linked list to operate on + * @param node the node from which to get the previous element in the list + * + * @return a pointer to the previous element from a node, NULL if node is the + * tail + */ + +static inline sys_dnode_t *sys_dlist_peek_prev_no_check(sys_dlist_t *list, + sys_dnode_t *node) +{ + return (node == list->head) ? NULL : node->prev; +} + +/** + * @brief get a reference to the previous item in the list + * + * @param list the doubly-linked list to operate on + * @param node the node from which to get the previous element in the list + * + * @return a pointer to the previous element from a node, NULL if node is the + * tail or NULL (when node comes from reading the head of an empty + * list). + */ + +static inline sys_dnode_t *sys_dlist_peek_prev(sys_dlist_t *list, + sys_dnode_t *node) +{ + return (node != NULL) ? sys_dlist_peek_prev_no_check(list, node) : NULL; +} + +/** + * @brief get a reference to the tail item in the list + * + * @param list the doubly-linked list to operate on + * + * @return a pointer to the tail element, NULL if list is empty + */ + +static inline sys_dnode_t *sys_dlist_peek_tail(sys_dlist_t *list) +{ + return sys_dlist_is_empty(list) ? NULL : list->tail; +} + +/** + * @brief add node to tail of list + * + * This and other sys_dlist_*() functions are not thread safe. + * + * @param list the doubly-linked list to operate on + * @param node the element to append + * + * @return N/A + */ + +static inline void sys_dlist_append(sys_dlist_t *list, sys_dnode_t *node) +{ + node->next = list; + node->prev = list->tail; + + list->tail->next = node; + list->tail = node; +} + +/** + * @brief add node to head of list + * + * This and other sys_dlist_*() functions are not thread safe. + * + * @param list the doubly-linked list to operate on + * @param node the element to append + * + * @return N/A + */ + +static inline void sys_dlist_prepend(sys_dlist_t *list, sys_dnode_t *node) +{ + node->next = list->head; + node->prev = list; + + list->head->prev = node; + list->head = node; +} + +/** + * @brief Insert a node into a list + * + * Insert a node before a specified node in a dlist. + * + * @param successor the position before which "node" will be inserted + * @param node the element to insert + */ +static inline void sys_dlist_insert(sys_dnode_t *successor, sys_dnode_t *node) +{ + node->prev = successor->prev; + node->next = successor; + successor->prev->next = node; + successor->prev = node; +} + +static inline void __deprecated sys_dlist_insert_after(sys_dlist_t *list, + sys_dnode_t *insert_point, sys_dnode_t *node) +{ + if (insert_point == NULL) { + sys_dlist_prepend(list, node); + } else { + node->next = insert_point->next; + node->prev = insert_point; + insert_point->next->prev = node; + insert_point->next = node; + } +} + +static inline void __deprecated sys_dlist_insert_before(sys_dlist_t *list, + sys_dnode_t *insert_point, sys_dnode_t *node) +{ + if (insert_point == NULL) { + sys_dlist_append(list, node); + } else { + node->prev = insert_point->prev; + node->next = insert_point; + insert_point->prev->next = node; + insert_point->prev = node; + } +} + +/** + * @brief insert node at position + * + * Insert a node in a location depending on a external condition. The cond() + * function checks if the node is to be inserted _before_ the current node + * against which it is checked. + * This and other sys_dlist_*() functions are not thread safe. + * + * @param list the doubly-linked list to operate on + * @param node the element to insert + * @param cond a function that determines if the current node is the correct + * insert point + * @param data parameter to cond() + * + * @return N/A + */ + +static inline void sys_dlist_insert_at(sys_dlist_t *list, sys_dnode_t *node, + int (*cond)(sys_dnode_t *node, void *data), void *data) +{ + if (sys_dlist_is_empty(list)) { + sys_dlist_append(list, node); + } else { + sys_dnode_t *pos = sys_dlist_peek_head(list); + + while ((pos != NULL) && (cond(pos, data) == 0)) { + pos = sys_dlist_peek_next(list, pos); + } + if (pos != NULL) { + sys_dlist_insert(pos, node); + } else { + sys_dlist_append(list, node); + } + } +} + +/** + * @brief remove a specific node from a list + * + * The list is implicit from the node. The node must be part of a list. + * This and other sys_dlist_*() functions are not thread safe. + * + * @param node the node to remove + * + * @return N/A + */ + +static inline void sys_dlist_remove(sys_dnode_t *node) +{ + node->prev->next = node->next; + node->next->prev = node->prev; + sys_dnode_init(node); +} + +/** + * @brief get the first node in a list + * + * This and other sys_dlist_*() functions are not thread safe. + * + * @param list the doubly-linked list to operate on + * + * @return the first node in the list, NULL if list is empty + */ + +static inline sys_dnode_t *sys_dlist_get(sys_dlist_t *list) +{ + sys_dnode_t *node = NULL; + + if (!sys_dlist_is_empty(list)) { + node = list->head; + sys_dlist_remove(node); + } + + return node; +} + +#ifdef __cplusplus +} +#endif + +#endif /* ZEPHYR_INCLUDE_SYS_DLIST_H_ */ diff --git a/include/sys_clock.h b/include/sys_clock.h index 60df21ab2be..290d4ee2cda 100644 --- a/include/sys_clock.h +++ b/include/sys_clock.h @@ -17,7 +17,7 @@ #define ZEPHYR_INCLUDE_SYS_CLOCK_H_ #include -#include +#include #ifdef __cplusplus extern "C" { diff --git a/kernel/include/kernel_structs.h b/kernel/include/kernel_structs.h index a1c73d75375..e2bf8418d2c 100644 --- a/kernel/include/kernel_structs.h +++ b/kernel/include/kernel_structs.h @@ -11,7 +11,7 @@ #if !defined(_ASMLANGUAGE) #include -#include +#include #include #include #include diff --git a/kernel/include/wait_q.h b/kernel/include/wait_q.h index 526b3212735..ca582bbc7c8 100644 --- a/kernel/include/wait_q.h +++ b/kernel/include/wait_q.h @@ -10,7 +10,7 @@ #define ZEPHYR_KERNEL_INCLUDE_WAIT_Q_H_ #include -#include +#include #include #include #include diff --git a/kernel/init.c b/kernel/init.c index eda9ac14054..28a118baf02 100644 --- a/kernel/init.c +++ b/kernel/init.c @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/kernel/mailbox.c b/kernel/mailbox.c index 4f61599ae42..ea62948b703 100644 --- a/kernel/mailbox.c +++ b/kernel/mailbox.c @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #if (CONFIG_NUM_MBOX_ASYNC_MSGS > 0) diff --git a/kernel/mem_slab.c b/kernel/mem_slab.c index 7e3765dd372..64765899c70 100644 --- a/kernel/mem_slab.c +++ b/kernel/mem_slab.c @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include diff --git a/kernel/msg_q.c b/kernel/msg_q.c index adf7dacae74..ef0bf43dbe4 100644 --- a/kernel/msg_q.c +++ b/kernel/msg_q.c @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/kernel/mutex.c b/kernel/mutex.c index fd570aa90dc..724c58e8439 100644 --- a/kernel/mutex.c +++ b/kernel/mutex.c @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/kernel/pipes.c b/kernel/pipes.c index 96671496abb..dbea28f6596 100644 --- a/kernel/pipes.c +++ b/kernel/pipes.c @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/kernel/poll.c b/kernel/poll.c index bd5e4876c29..beb641ece9b 100644 --- a/kernel/poll.c +++ b/kernel/poll.c @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/kernel/sem.c b/kernel/sem.c index 53e0f81a3ab..e9b7a5ed60e 100644 --- a/kernel/sem.c +++ b/kernel/sem.c @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/cntr.c b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/cntr.c index 0e4c60f019b..28868d5e4c9 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/cntr.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/cntr.c @@ -5,7 +5,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include +#include #include #include "hal/cntr.h" diff --git a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/ecb.c b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/ecb.c index 8868eda7f2c..f8ecba13afb 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/ecb.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/ecb.c @@ -7,7 +7,7 @@ #include -#include +#include #include #include "util/mem.h" diff --git a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.c b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.c index 2dc146a85ea..881a98e65bb 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.c @@ -5,7 +5,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include +#include #include #include diff --git a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/ticker.c b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/ticker.c index 09350620fc8..7037f49c1d6 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/ticker.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/ticker.c @@ -6,7 +6,7 @@ */ #include -#include +#include #include #include "hal/cntr.h" diff --git a/tests/kernel/common/src/dlist.c b/tests/kernel/common/src/dlist.c index 4c60ff528c5..639b90fe73a 100644 --- a/tests/kernel/common/src/dlist.c +++ b/tests/kernel/common/src/dlist.c @@ -5,7 +5,7 @@ */ #include -#include +#include static sys_dlist_t test_list;