]> git.meshlink.io Git - meshlink/blobdiff - src/list.c
Avoid allocating packet buffers unnecessarily.
[meshlink] / src / list.c
index c74eb2132cf24913f9619c632f1740def270906d..b93ebfc5f5f59298da1e5ecd73efd5514867dd0d 100644 (file)
@@ -35,13 +35,14 @@ void list_free(list_t *list) {
        free(list);
 }
 
-list_node_t *list_alloc_node(void) {
+static list_node_t *list_alloc_node(void) {
        return xzalloc(sizeof(list_node_t));
 }
 
-void list_free_node(list_t *list, list_node_t *node) {
-       if(node->data && list->delete)
+static void list_free_node(list_t *list, list_node_t *node) {
+       if(node->data && list->delete) {
                list->delete(node->data);
+       }
 
        free(node);
 }
@@ -56,10 +57,11 @@ list_node_t *list_insert_head(list_t *list, void *data) {
        node->next = list->head;
        list->head = node;
 
-       if(node->next)
+       if(node->next) {
                node->next->prev = node;
-       else
+       } else {
                list->tail = node;
+       }
 
        list->count++;
 
@@ -74,64 +76,33 @@ list_node_t *list_insert_tail(list_t *list, void *data) {
        node->prev = list->tail;
        list->tail = node;
 
-       if(node->prev)
+       if(node->prev) {
                node->prev->next = node;
-       else
+       } else {
                list->head = node;
+       }
 
        list->count++;
 
        return node;
 }
 
-list_node_t *list_insert_after(list_t *list, list_node_t *after, void *data) {
-       list_node_t *node = list_alloc_node();
-
-       node->data = data;
-       node->next = after->next;
-       node->prev = after;
-       after->next = node;
-
-       if(node->next)
-               node->next->prev = node;
-       else
-               list->tail = node;
-
-       list->count++;
-
-       return node;
-}
-
-list_node_t *list_insert_before(list_t *list, list_node_t *before, void *data) {
-       list_node_t *node;
+static void list_unlink_node(list_t *list, list_node_t *node) {
+       assert(list->count);
+       assert(node->prev || list->head == node);
+       assert(node->next || list->tail == node);
 
-       node = list_alloc_node();
-
-       node->data = data;
-       node->next = before;
-       node->prev = before->prev;
-       before->prev = node;
-
-       if(node->prev)
-               node->prev->next = node;
-       else
-               list->head = node;
-
-       list->count++;
-
-       return node;
-}
-
-void list_unlink_node(list_t *list, list_node_t *node) {
-       if(node->prev)
+       if(node->prev) {
                node->prev->next = node->next;
-       else
+       } else {
                list->head = node->next;
+       }
 
-       if(node->next)
+       if(node->next) {
                node->next->prev = node->prev;
-       else
+       } else {
                list->tail = node->prev;
+       }
 
        list->count--;
 }
@@ -150,32 +121,40 @@ void list_delete_tail(list_t *list) {
 }
 
 void list_delete(list_t *list, const void *data) {
-       for(list_node_t *node = list->head, *next; next = node ? node->next : NULL, node; node = next)
-               if(node->data == data)
+       for(list_node_t *node = list->head, *next; next = node ? node->next : NULL, node; node = next) {
+               if(node->data == data) {
                        list_delete_node(list, node);
+               }
+       }
 }
 
 /* Head/tail lookup */
 
 void *list_get_head(list_t *list) {
-       if(list->head)
+       if(list->head) {
                return list->head->data;
-       else
+       } else {
                return NULL;
+       }
 }
 
 void *list_get_tail(list_t *list) {
-       if(list->tail)
+       if(list->tail) {
                return list->tail->data;
-       else
+       } else {
                return NULL;
+       }
 }
 
 /* Fast list deletion */
 
 void list_delete_list(list_t *list) {
-       for(list_node_t *node = list->head, *next; next = node ? node->next : NULL, node; node = next)
+       for(list_node_t *node = list->head, *next; next = node ? node->next : NULL, node; node = next) {
                list_free_node(list, node);
+               list->count--;
+       }
+
+       assert(!list->count);
 
        list_free(list);
 }
@@ -183,12 +162,15 @@ void list_delete_list(list_t *list) {
 /* Traversing */
 
 void list_foreach_node(list_t *list, list_action_node_t action) {
-       for(list_node_t *node = list->head, *next; next = node ? node->next : NULL, node; node = next)
+       for(list_node_t *node = list->head, *next; next = node ? node->next : NULL, node; node = next) {
                action(node);
+       }
 }
 
 void list_foreach(list_t *list, list_action_t action) {
-       for(list_node_t *node = list->head, *next; next = node ? node->next : NULL, node; node = next)
-               if(node->data)
+       for(list_node_t *node = list->head, *next; next = node ? node->next : NULL, node; node = next) {
+               if(node->data) {
                        action(node->data);
+               }
+       }
 }