MOS Source Code
Loading...
Searching...
No Matches
libs.LinkedList

A circular, doubly-linked list. More...

+ Collaboration diagram for libs.LinkedList:

Classes

struct  list_node_t
 A node in a linked list. More...
 

Macros

#define as_linked_list   list_node_t list_node
 Embed a list node into a struct.
 
#define LIST_HEAD_INIT(container)   { .prev = &(container), .next = &(container) }
 
#define LIST_NODE_INIT(container)   LIST_HEAD_INIT(container.list_node)
 
#define list_entry(node, type)   container_of((node), type, list_node)
 Get the container struct of a list node.
 
#define list_prev_entry(item, type)   list_entry(list_node(item)->prev, type)
 Get the next element in a list.
 
#define list_next_entry(item, type)   list_entry(list_node(item)->next, type)
 Get the next element in a list.
 
#define list_node_next_entry(node, type)   container_of((node)->next, type, list_node)
 Get the next list node.
 
#define list_node(element)   (&((element)->list_node))
 Get the ‘list_node’ of a list element. This is exactly the reverse of ‘list_entry’ above.
 
#define list_prepend(element, item)   list_node_prepend(list_node(element), list_node(item))
 
#define list_append(element, item)   list_node_append(list_node(element), list_node(item))
 
#define list_insert_before(element, item)   list_node_insert_before(list_node(element), list_node(item))
 
#define list_insert_after(element, item)   list_node_insert_after(list_node(element), list_node(item))
 
#define list_remove(element)   list_node_remove(list_node(element))
 
#define list_foreach(t, v, h)    for (__typeof(list_entry(&(h), t)) v = list_entry((h).next, t), __next = list_next_entry(v, t); list_node(v) != &(h); v = __next, __next = list_next_entry(v, t))
 Iterate over a list.
 
#define list_foreach_reverse(t, v, h)    for (__typeof(list_entry(&(h), t)) v = list_entry((h).prev, t), __next = list_prev_entry(v, t); list_node(v) != &(h); v = __next, __next = list_prev_entry(v, t))
 
#define list_node_foreach(v, h)   for (list_node_t *v = (h)->next, *__next = v->next; v != (h); v = __next, __next = v->next)
 
#define list_node_foreach_reverse(v, h)   for (list_node_t *v = (h)->prev, *__next = v->prev; v != (h); v = __next, __next = v->prev)
 
#define list_headless_foreach(t, v, h)
 
#define list_headless_foreach_reverse(t, v, h)
 

Typedefs

typedef list_node_t list_head
 A linked list head.
 

Functions

MOSAPI void linked_list_init (list_node_t *head_node)
 Initialise a circular double linked list.
 
MOSAPI bool list_is_empty (const list_node_t *head)
 
MOSAPI void list_node_remove (list_node_t *link)
 
MOSAPI list_node_t * list_node_pop (list_node_t *head)
 
MOSAPI void list_node_prepend (list_node_t *head, list_node_t *item)
 
MOSAPI void list_node_append (list_node_t *head, list_node_t *item)
 
MOSAPI void list_node_insert_before (list_node_t *element, list_node_t *item)
 
MOSAPI void list_node_insert_after (list_node_t *element, list_node_t *item)
 

Detailed Description

A circular, doubly-linked list.

Macro Definition Documentation

◆ as_linked_list

#define as_linked_list   list_node_t list_node

Embed a list node into a struct.

Definition at line 36 of file list.h.

◆ LIST_HEAD_INIT

#define LIST_HEAD_INIT ( container)    { .prev = &(container), .next = &(container) }

◆ LIST_NODE_INIT

◆ list_entry

#define list_entry ( node,
type )   container_of((node), type, list_node)

Get the container struct of a list node.

Definition at line 47 of file list.h.

Referenced by break_the_order(), buddy_alloc_n_exact(), MOS_TEST_CASE(), and waitlist_wake().

◆ list_prev_entry

#define list_prev_entry ( item,
type )   list_entry(list_node(item)->prev, type)

Get the next element in a list.

Definition at line 52 of file list.h.

◆ list_next_entry

#define list_next_entry ( item,
type )   list_entry(list_node(item)->next, type)

Get the next element in a list.

Definition at line 57 of file list.h.

Referenced by MOS_TEST_CASE().

◆ list_node_next_entry

#define list_node_next_entry ( node,
type )   container_of((node)->next, type, list_node)

Get the next list node.

Definition at line 63 of file list.h.

Referenced by ipc_server_accept().

◆ list_node

◆ list_prepend

#define list_prepend ( element,
item )   list_node_prepend(list_node(element), list_node(item))

Definition at line 71 of file list.h.

◆ list_append

#define list_append ( element,
item )   list_node_append(list_node(element), list_node(item))

Definition at line 72 of file list.h.

Referenced by MOS_TEST_CASE().

◆ list_insert_before

#define list_insert_before ( element,
item )   list_node_insert_before(list_node(element), list_node(item))

Definition at line 73 of file list.h.

Referenced by do_attach_vmap().

◆ list_insert_after

#define list_insert_after ( element,
item )   list_node_insert_after(list_node(element), list_node(item))

Definition at line 74 of file list.h.

◆ list_remove

◆ list_foreach

◆ list_foreach_reverse

#define list_foreach_reverse ( t,
v,
h )    for (__typeof(list_entry(&(h), t)) v = list_entry((h).prev, t), __next = list_prev_entry(v, t); list_node(v) != &(h); v = __next, __next = list_prev_entry(v, t))

Definition at line 87 of file list.h.

◆ list_node_foreach

#define list_node_foreach ( v,
h )   for (list_node_t *v = (h)->next, *__next = v->next; v != (h); v = __next, __next = v->next)

◆ list_node_foreach_reverse

#define list_node_foreach_reverse ( v,
h )   for (list_node_t *v = (h)->prev, *__next = v->prev; v != (h); v = __next, __next = v->prev)

Definition at line 91 of file list.h.

◆ list_headless_foreach

#define list_headless_foreach ( t,
v,
h )
Value:
for (__typeof(&(h)) v = &(h), __next = list_next_entry(v, t), __head = NULL; (v) != __head; \
v = __next, __next = list_next_entry(v, t), __head = __head == NULL ? &(h) : __head)
#define list_next_entry(item, type)
Get the next element in a list.
Definition list.h:57
#define NULL
Definition pb_syshdr.h:46

Definition at line 93 of file list.h.

Referenced by MOS_TEST_CASE().

◆ list_headless_foreach_reverse

#define list_headless_foreach_reverse ( t,
v,
h )
Value:
for (__typeof(h) v = (h), __next = list_prev_entry(v, t), __head = NULL; (v) != __head; \
v = __next, __next = list_prev_entry(v, t), __head = __head == NULL ? (h) : __head)
#define list_prev_entry(item, type)
Get the next element in a list.
Definition list.h:52

Definition at line 97 of file list.h.

Referenced by MOS_TEST_CASE().

Typedef Documentation

◆ list_head

typedef list_node_t list_head

A linked list head.

Note
The list head should be placed in the heap, not on the stack. This is because the list head is a circular list, and the ‘prev’ and ‘next’ pointers of the list head point to itself.

Definition at line 24 of file list.h.

Function Documentation

◆ linked_list_init()

◆ list_is_empty()

◆ list_node_remove()

MOSAPI void list_node_remove ( list_node_t * link)

Definition at line 26 of file list.c.

Referenced by dentry_unmount(), list_node_pop(), MOS_TEST_CASE(), and MOS_TEST_CASE().

◆ list_node_pop()

MOSAPI list_node_t * list_node_pop ( list_node_t * head)

Definition at line 56 of file list.c.

Referenced by waitlist_wake().

+ Here is the call graph for this function:

◆ list_node_prepend()

MOSAPI void list_node_prepend ( list_node_t * head,
list_node_t * item )

Definition at line 63 of file list.c.

Referenced by MOS_TEST_CASE(), and process_do_fork().

+ Here is the call graph for this function:

◆ list_node_append()

◆ list_node_insert_before()

MOSAPI void list_node_insert_before ( list_node_t * element,
list_node_t * item )

Definition at line 74 of file list.c.

Referenced by add_to_freelist(), and MOS_TEST_CASE().

+ Here is the call graph for this function:

◆ list_node_insert_after()

MOSAPI void list_node_insert_after ( list_node_t * element,
list_node_t * item )

Definition at line 79 of file list.c.

Referenced by MOS_TEST_CASE().

+ Here is the call graph for this function: