25 p_list->end_item.next_ptr = (list_item_t *)&(p_list->end_item);
26 p_list->end_item.prev_ptr = (list_item_t *)&(p_list->end_item);
28 p_list->num_of_items = (uint16_t)0U;
37 p_list_item->list_ptr = NULL;
47 if (list_get_num_item(p_list) == 0u)
49 p_list_item->next_ptr = &(p_list->end_item);
50 p_list_item->prev_ptr = &(p_list->end_item);
52 p_list->end_item.next_ptr = p_list_item;
53 p_list->end_item.prev_ptr = p_list_item;
55 p_list->curr_item_ptr = p_list_item;
59 list_item_t *
const p_last_item = p_list->end_item.prev_ptr;
61 p_last_item->next_ptr = p_list_item;
62 p_list_item->prev_ptr = p_last_item;
64 p_list_item->next_ptr = &(p_list->end_item);
65 p_list->end_item.prev_ptr = p_list_item;
69 p_list_item->list_ptr = p_list;
71 (p_list->num_of_items)++;
81 if ((p_list_item)->next_ptr != &(list_item_get_list_contain(p_list_item)->end_item))
82 return (p_list_item)->next_ptr;
84 return (p_list_item)->next_ptr->next_ptr;
93 if ((p_list_item)->prev_ptr != &(list_item_get_list_contain(p_list_item)->end_item))
94 return (p_list_item)->prev_ptr;
96 return (p_list_item)->prev_ptr->prev_ptr;
106 if (list_get_num_item(p_list) == 0u)
110 list_item_t *p_iterator;
111 const uint32_t value_to_insert = p_list_item->value;
114 p_iterator = p_list->end_item.prev_ptr;
118 for (p_iterator = (list_item_t *)&(p_list->end_item); p_iterator->next_ptr->value <= value_to_insert; p_iterator = p_iterator->next_ptr)
123 p_list_item->next_ptr = p_iterator->next_ptr;
124 p_list_item->next_ptr->prev_ptr = p_list_item;
125 p_list_item->prev_ptr = p_iterator;
126 p_iterator->next_ptr = p_list_item;
130 p_list_item->list_ptr = p_list;
132 (p_list->num_of_items)++;
143 list_t *
const p_list = p_list_item->list_ptr;
145 p_list_item->next_ptr->prev_ptr = p_list_item->prev_ptr;
146 p_list_item->prev_ptr->next_ptr = p_list_item->next_ptr;
149 if (p_list->curr_item_ptr == p_list_item)
151 p_list->curr_item_ptr = p_list_item->prev_ptr;
158 p_list_item->list_ptr = NULL;
159 (p_list->num_of_items)--;
161 return p_list->num_of_items;
171 list_t *
const p_const_list = (p_list);
174 (p_const_list)->curr_item_ptr = (p_const_list)->curr_item_ptr->next_ptr;
176 if ((
void *)(p_const_list)->curr_item_ptr == (
void *)&((p_const_list)->end_item))
178 (p_const_list)->curr_item_ptr = (p_const_list)->curr_item_ptr->next_ptr;
181 return (p_const_list)->curr_item_ptr->owner_ptr;
Build-time configuration macros for AK-mOS.
void akos_list_item_init(list_item_t *const p_list_item)
Initialize list item ownership metadata.
void akos_list_init(list_t *const p_list)
Initialize list sentinel and metadata.
void * akos_list_get_owner_of_next_item(list_t *const p_list)
Round-robin helper to get owner of next list item.
void akos_list_insert(list_t *const p_list, list_item_t *const p_list_item)
Insert item by ascending item value.
void akos_list_insert_end(list_t *const p_list, list_item_t *const p_list_item)
Insert item at end of list.
list_item_t * akos_list_item_get_prev(list_item_t *p_list_item)
Get previous item, skipping list end marker.
uint16_t akos_list_remove(list_item_t *const p_list_item)
Remove item from its containing list.
list_item_t * akos_list_item_get_next(list_item_t *p_list_item)
Get next item, skipping list end marker.
Doubly-linked list types and APIs for scheduler internals.