Zephyr API Documentation  2.7.0-rc2
A Scalable Open Source RTOS
dlist.h File Reference

Doubly-linked list implementation. More...

#include <stddef.h>
#include <stdbool.h>
#include <toolchain.h>

Go to the source code of this file.

Macros

#define SYS_DLIST_FOR_EACH_NODE(__dl, __dn)
 Provide the primitive to iterate on a list Note: the loop is unsafe and thus __dn should not be removed. More...
 
#define SYS_DLIST_ITERATE_FROM_NODE(__dl, __dn)
 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. More...
 
#define SYS_DLIST_FOR_EACH_NODE_SAFE(__dl, __dn, __dns)
 Provide the primitive to safely iterate on a list Note: __dn can be removed, it will not break the loop. More...
 
#define SYS_DLIST_CONTAINER(__dn, __cn, __n)    ((__dn != NULL) ? CONTAINER_OF(__dn, __typeof__(*__cn), __n) : NULL)
 
#define SYS_DLIST_PEEK_HEAD_CONTAINER(__dl, __cn, __n)    SYS_DLIST_CONTAINER(sys_dlist_peek_head(__dl), __cn, __n)
 
#define SYS_DLIST_PEEK_NEXT_CONTAINER(__dl, __cn, __n)
 
#define SYS_DLIST_FOR_EACH_CONTAINER(__dl, __cn, __n)
 Provide the primitive to iterate on a list under a container Note: the loop is unsafe and thus __cn should not be detached. More...
 
#define SYS_DLIST_FOR_EACH_CONTAINER_SAFE(__dl, __cn, __cns, __n)
 Provide the primitive to safely iterate on a list under a container Note: __cn can be detached, it will not break the loop. More...
 
#define SYS_DLIST_STATIC_INIT(ptr_to_list)   { {(ptr_to_list)}, {(ptr_to_list)} }
 

Typedefs

typedef struct _dnode sys_dlist_t
 
typedef struct _dnode sys_dnode_t
 

Functions

static void sys_dlist_init (sys_dlist_t *list)
 initialize list to its empty state More...
 
static void sys_dnode_init (sys_dnode_t *node)
 initialize node to its state when not in a list More...
 
static bool sys_dnode_is_linked (const sys_dnode_t *node)
 check if a node is a member of any list More...
 
static bool sys_dlist_is_head (sys_dlist_t *list, sys_dnode_t *node)
 check if a node is the list's head More...
 
static bool sys_dlist_is_tail (sys_dlist_t *list, sys_dnode_t *node)
 check if a node is the list's tail More...
 
static bool sys_dlist_is_empty (sys_dlist_t *list)
 check if the list is empty More...
 
static bool sys_dlist_has_multiple_nodes (sys_dlist_t *list)
 check if more than one node present More...
 
static sys_dnode_tsys_dlist_peek_head (sys_dlist_t *list)
 get a reference to the head item in the list More...
 
static sys_dnode_tsys_dlist_peek_head_not_empty (sys_dlist_t *list)
 get a reference to the head item in the list More...
 
static sys_dnode_tsys_dlist_peek_next_no_check (sys_dlist_t *list, sys_dnode_t *node)
 get a reference to the next item in the list, node is not NULL More...
 
static sys_dnode_tsys_dlist_peek_next (sys_dlist_t *list, sys_dnode_t *node)
 get a reference to the next item in the list More...
 
static sys_dnode_tsys_dlist_peek_prev_no_check (sys_dlist_t *list, sys_dnode_t *node)
 get a reference to the previous item in the list, node is not NULL More...
 
static sys_dnode_tsys_dlist_peek_prev (sys_dlist_t *list, sys_dnode_t *node)
 get a reference to the previous item in the list More...
 
static sys_dnode_tsys_dlist_peek_tail (sys_dlist_t *list)
 get a reference to the tail item in the list More...
 
static void sys_dlist_append (sys_dlist_t *list, sys_dnode_t *node)
 add node to tail of list More...
 
static void sys_dlist_prepend (sys_dlist_t *list, sys_dnode_t *node)
 add node to head of list More...
 
static void sys_dlist_insert (sys_dnode_t *successor, sys_dnode_t *node)
 Insert a node into a list. More...
 
static void sys_dlist_insert_at (sys_dlist_t *list, sys_dnode_t *node, int(*cond)(sys_dnode_t *node, void *data), void *data)
 insert node at position More...
 
static void sys_dlist_remove (sys_dnode_t *node)
 remove a specific node from a list More...
 
static sys_dnode_tsys_dlist_get (sys_dlist_t *list)
 get the first node in a list More...
 

Detailed Description

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.