1 #include <xtypes/xpool.h>
3 static inline int __validate_idx(struct xpool *xp, xpool_index idx)
5 struct xpool_node *node = XPTR(&xp->mem)+idx;
6 return (idx < xp->size && node->prev != NoIndex);
9 void __xpool_clear(struct xpool *xp)
12 uint64_t size = xp->size;
13 struct xpool_node *mem = XPTR(&xp->mem);
16 for (i = 1; i < size; i++) {
17 mem[i-1].prev = NoIndex;
20 mem[size-1].prev = NoIndex;
21 mem[size-1].next = NoIndex;
25 void xpool_clear(struct xpool *xp, uint32_t who)
27 xlock_acquire(&xp->lock, who);
29 xlock_release(&xp->lock);
32 void xpool_init(struct xpool *xp, uint64_t size, struct xpool_node* mem)
35 XPTRSET(&xp->mem, mem);
36 xlock_release(&xp->lock);
40 xpool_index __xpool_add(struct xpool *xp, xpool_data data)
42 struct xpool_node *new, *list, *prev;
49 new = XPTR(&xp->mem) + idx;
53 if (xp->list != NoIndex) {
54 list = XPTR(&xp->mem) + xp->list;
56 new->prev = list->prev;
58 prev = XPTR(&xp->mem) + list->prev;
68 list = XPTR(&xp->mem) + idx;
69 printf("xpool data: %llu(%llu), ", xp->list, list->data );
72 list = XPTR(&xp->mem) + idx;
73 printf("%llu(%llu), ", idx, list->data);
74 }while(idx != xp->list);
81 xpool_index xpool_add(struct xpool *xp, xpool_data data, uint32_t who)
84 xlock_acquire(&xp->lock, who);
85 idx = __xpool_add(xp, data);
86 xlock_release(&xp->lock);
90 xpool_index xpool_add(struct xpool *xp, xpool_data data)
92 struct xpool_node *new, *list, *free, *next, *prev;
94 xlock_acquire(&xp->lock, 1);
95 free = XPTR(&xp->free);
96 list = XPTR(&xp->list);
99 xlock_release(&xp->lock);
102 free = XPTR(&new->next);
103 XPTRSET(&xp->free, free);
105 //new->next = xp->list;
106 XPTRSET(&new->next, list);
108 prev = XPTR(&list->prev);
109 XPTRSET(&new->prev, prev);
110 //new->prev = xp->list->prev;
112 next = XPTR(&prev->next);
113 XPTRSET(&prev->next, new);
114 //xp->list->prev->next = new;
116 XPTRSET(&list->prev, new);
117 //xp->list->prev = new;
119 XPTRSET(&new->next ,new);
121 XPTRSET(&new->prev, new);
123 XPTRSET(&xp->list, new);
128 xlock_release(&xp->lock);
129 return (new - XPTR(&xp->mem));
133 xpool_index xpool_remove(struct xpool *xp, xpool_index idx, xpool_data *data)
135 struct xpool_node *node, *list, *free, *prev, *next;
137 xlock_acquire(&xp->lock, 1);
138 if (!__validate_idx(xp, idx)){ // idx < xp->size && node->prev != NULL
139 xlock_release(&xp->lock);
142 node = XPTR(&xp->mem) + idx;
144 list = XPTR(&xp->list);
145 free = XPTR(&xp->free);
146 next = XPTR(&node->next);
147 prev = XPTR(&node->prev);
150 XPTRSET(&xp->list, NULL);
153 XPTRSET(&xp->list, next);
154 //xp->list = node->next;
156 XPTRSET(&prev->next, next);
157 //node->prev->next = node->next;
158 XPTRSET(&next->prev, prev);
159 //node->next->prev = node->prev;
160 XPTRSET(&node->prev, NULL);
162 XPTRSET(&node->next, free);
163 //node->next = xp->free;
165 XPTRSET(&xp->free, free);
169 xlock_release(&xp->lock);
173 xpool_index __xpool_remove(struct xpool *xp, xpool_index idx, xpool_data *data)
175 struct xpool_node *node, *prev, *next;
176 if (!__validate_idx(xp, idx)){ // idx < xp->size && node->prev != NULL
179 node = XPTR(&xp->mem) + idx;
182 if (idx == xp->list){
183 if ( idx == node->next)
186 xp->list = node->next;
188 prev = XPTR(&xp->mem) + node->prev;
189 prev->next = node->next;
191 next = XPTR(&xp->mem) + node->next;
192 next->prev = node->prev;
194 node->prev = NoIndex;
195 node->next = xp->free;
200 xpool_index xpool_remove(struct xpool *xp, xpool_index idx, xpool_data *data, uint32_t who)
203 xlock_acquire(&xp->lock, who);
204 ret = __xpool_remove(xp, idx, data);
205 xlock_release(&xp->lock);
209 xpool_index __xpool_peek(struct xpool *xp, xpool_data *data)
211 struct xpool_node *list;
213 if (xp->list == NoIndex){
217 list = XPTR(&xp->mem) + xp->list;
222 xpool_index xpool_peek(struct xpool *xp, xpool_data *data, uint32_t who)
225 xlock_acquire(&xp->lock, who);
226 ret = __xpool_peek(xp, data);
227 xlock_release(&xp->lock);
231 xpool_index __xpool_peek_idx(struct xpool *xp, xpool_index idx, xpool_data *data)
233 struct xpool_node *node;
234 if (!__validate_idx(xp, idx)){
237 node = XPTR(&xp->mem) + idx;
242 xpool_index xpool_peek_idx(struct xpool *xp, xpool_index idx, xpool_data *data, uint32_t who)
245 xlock_acquire(&xp->lock, who);
246 ret = __xpool_peek_idx(xp,idx,data);
247 xlock_release(&xp->lock);
251 xpool_index __xpool_peek_and_fwd(struct xpool *xp, xpool_data *data)
253 struct xpool_node *list;
255 if (xp->list == NoIndex){
259 list = XPTR(&xp->mem) + xp->list;
261 xp->list = list->next;
265 xpool_index xpool_peek_and_fwd(struct xpool *xp, xpool_data *data, uint32_t who)
268 xlock_acquire(&xp->lock, who);
269 ret = __xpool_peek_and_fwd(xp,data);
270 xlock_release(&xp->lock);
275 xpool_index xpool_peek_and_fwd(struct xpool *xp, xpool_data *data)
277 struct xpool_node *list, *next;
279 xlock_acquire(&xp->lock, 1);
280 list = XPTR(&xp->list);
282 xlock_release(&xp->lock);
286 next = XPTR(&list->next);
287 XPTRSET(&xp->list, next);
288 //xp->list = xp->list->next;
290 xlock_release(&xp->lock);
291 return (list - XPTR(&xp->mem));
295 xpool_index __xpool_set_idx(struct xpool *xp, xpool_index idx, xpool_data data)
297 struct xpool_node *node;
298 if (!__validate_idx(xp, idx)){
301 node = XPTR(&xp->mem) + idx;
306 xpool_index xpool_set_idx(struct xpool *xp, xpool_index idx, xpool_data data, uint32_t who)
309 xlock_acquire(&xp->lock, who);
310 ret = __xpool_set_idx(xp, idx, data);
311 xlock_release(&xp->lock);
317 #include <linux/module.h>
318 #include <xtypes/xpool_exports.h>