12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- #ifndef LIST_H
- #define LIST_H
- #include "fw.h"
- typedef uint32_t key_t;
- /* --- Doubly linked list (head node assumed) --- */
- struct dll {
- struct dll *prev, *next;
- };
- static inline void dll_init(struct dll *head)
- {
- head->prev = head->next = head;
- }
- static inline struct dll *dll_find_offs(struct dll *head, key_t key,
- ptrdiff_t key_offset)
- {
- for (const struct dll *nh = head->next; nh != head; nh = nh->next) {
- const key_t *node_key = (const key_t *)((const char *)nh + key_offset);
- if (*node_key == key)
- return (struct dll *)nh;
- }
- return NULL;
- }
- #define dll_find(head,what,struc,list,key) \
- ({ \
- struct dll *node = dll_find_offs(head, what, offset_diff(struc,key,list)); \
- (struc *)(node ? container_of(node, struc, list) : NULL); \
- })
- /* Remove from linked list */
- static inline void dll_remove(struct dll *node)
- {
- node->prev->next = node->next;
- node->next->prev = node->prev;
- node->next = node;
- node->prev = node;
- }
- /* Add to linked list */
- static inline void dll_insert_head(struct dll *head, struct dll *node)
- {
- node->prev = head;
- node->next = head->next;
- head->next = node;
- node->next->prev = node;
- }
- static inline void dll_insert_tail(struct dll *head, struct dll *node)
- {
- node->next = head;
- node->prev = head->prev;
- head->prev = node;
- node->prev->next = node;
- }
- /* Move to beginning of linked list */
- static inline void dll_promote(struct dll *head, struct dll *node)
- {
- dll_remove(node);
- dll_insert_head(head, node);
- }
- /* Move to end of linked list */
- static inline void dll_demote(struct dll *head, struct dll *node)
- {
- dll_remove(node);
- dll_insert_tail(head, node);
- }
- #endif /* LIST_H */
|