AKOS  v1.0.0
Documentation
Loading...
Searching...
No Matches
list.c
Go to the documentation of this file.
1/****************************************************************************/
12
13#include "config.h"
14#include "list.h"
15
20void akos_list_init(list_t *const p_list)
21{
22 p_list->end_item.value = OS_CFG_DELAY_MAX;
23
24 /* End item points to itself when list is empty */
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);
27
28 p_list->num_of_items = (uint16_t)0U;
29}
30
35void akos_list_item_init(list_item_t *const p_list_item)
36{
37 p_list_item->list_ptr = NULL; /* The list is more important, all the members of item will be set later */
38}
39
45void akos_list_insert_end(list_t *const p_list, list_item_t *const p_list_item)
46{
47 if (list_get_num_item(p_list) == 0u)
48 {
49 p_list_item->next_ptr = &(p_list->end_item);
50 p_list_item->prev_ptr = &(p_list->end_item);
51
52 p_list->end_item.next_ptr = p_list_item;
53 p_list->end_item.prev_ptr = p_list_item;
54
55 p_list->curr_item_ptr = p_list_item;
56 }
57 else
58 {
59 list_item_t *const p_last_item = p_list->end_item.prev_ptr;
60
61 p_last_item->next_ptr = p_list_item;
62 p_list_item->prev_ptr = p_last_item;
63
64 p_list_item->next_ptr = &(p_list->end_item);
65 p_list->end_item.prev_ptr = p_list_item;
66 }
67
68 /* Remember which list the item is in. */
69 p_list_item->list_ptr = p_list;
70
71 (p_list->num_of_items)++;
72}
73
79list_item_t *akos_list_item_get_next(list_item_t *p_list_item)
80{
81 if ((p_list_item)->next_ptr != &(list_item_get_list_contain(p_list_item)->end_item))
82 return (p_list_item)->next_ptr;
83 else
84 return (p_list_item)->next_ptr->next_ptr;
85}
86
91list_item_t *akos_list_item_get_prev(list_item_t *p_list_item)
92{
93 if ((p_list_item)->prev_ptr != &(list_item_get_list_contain(p_list_item)->end_item))
94 return (p_list_item)->prev_ptr;
95 else
96 return (p_list_item)->prev_ptr->prev_ptr;
97}
98
104void akos_list_insert(list_t *const p_list, list_item_t *const p_list_item)
105{
106 if (list_get_num_item(p_list) == 0u)
107 akos_list_insert_end(p_list, p_list_item);
108 else
109 {
110 list_item_t *p_iterator;
111 const uint32_t value_to_insert = p_list_item->value;
112 if (value_to_insert == OS_CFG_DELAY_MAX)
113 {
114 p_iterator = p_list->end_item.prev_ptr;
115 }
116 else
117 {
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)
119 {
120 /* Iterate through list */
121 }
122 }
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;
127
128 /* Remember which list the item is in. This allows fast removal of the
129 * item later. */
130 p_list_item->list_ptr = p_list;
131
132 (p_list->num_of_items)++;
133 }
134}
135
141uint16_t akos_list_remove(list_item_t *const p_list_item)
142{
143 list_t *const p_list = p_list_item->list_ptr;
144
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;
147
148 /* Update curr item to the previous */
149 if (p_list->curr_item_ptr == p_list_item)
150 {
151 p_list->curr_item_ptr = p_list_item->prev_ptr;
152 }
153 else
154 {
155 // mtCOVERAGE_TEST_MARKER();
156 }
157
158 p_list_item->list_ptr = NULL;
159 (p_list->num_of_items)--;
160
161 return p_list->num_of_items;
162}
163
169void *akos_list_get_owner_of_next_item(list_t *const p_list)
170{
171 list_t *const p_const_list = (p_list);
172 /* Increment the index to the next item and return the item, ensuring */
173 /* we don't return the marker used at the end of the list. */
174 (p_const_list)->curr_item_ptr = (p_const_list)->curr_item_ptr->next_ptr;
175
176 if ((void *)(p_const_list)->curr_item_ptr == (void *)&((p_const_list)->end_item))
177 {
178 (p_const_list)->curr_item_ptr = (p_const_list)->curr_item_ptr->next_ptr;
179 }
180
181 return (p_const_list)->curr_item_ptr->owner_ptr;
182}
Build-time configuration macros for AK-mOS.
#define OS_CFG_DELAY_MAX
Definition config.h:27
void akos_list_item_init(list_item_t *const p_list_item)
Initialize list item ownership metadata.
Definition list.c:35
void akos_list_init(list_t *const p_list)
Initialize list sentinel and metadata.
Definition list.c:20
void * akos_list_get_owner_of_next_item(list_t *const p_list)
Round-robin helper to get owner of next list item.
Definition list.c:169
void akos_list_insert(list_t *const p_list, list_item_t *const p_list_item)
Insert item by ascending item value.
Definition list.c:104
void akos_list_insert_end(list_t *const p_list, list_item_t *const p_list_item)
Insert item at end of list.
Definition list.c:45
list_item_t * akos_list_item_get_prev(list_item_t *p_list_item)
Get previous item, skipping list end marker.
Definition list.c:91
uint16_t akos_list_remove(list_item_t *const p_list_item)
Remove item from its containing list.
Definition list.c:141
list_item_t * akos_list_item_get_next(list_item_t *p_list_item)
Get next item, skipping list end marker.
Definition list.c:79
Doubly-linked list types and APIs for scheduler internals.