X-Git-Url: https://git.archive.openwrt.org/?a=blobdiff_plain;f=utils.c;h=0b13f86c7c2fd514f50c6ade39c5dec1fdf14490;hb=f5f78c1eca1fe2df04dae56a4d9f024533066b29;hp=31a5967e508f90be115f4943763d746b8064cc07;hpb=3c024e7b3170bd2d3869a404b08bc20345bc6f81;p=project%2Fnetifd.git diff --git a/utils.c b/utils.c index 31a5967..0b13f86 100644 --- a/utils.c +++ b/utils.c @@ -1,4 +1,5 @@ #include +#include #include "utils.h" int @@ -38,10 +39,12 @@ vlist_add(struct vlist_tree *tree, struct vlist_node *node) anode = avl_find(&tree->avl, key); if (anode) { - if (tree->keep_old || !tree->no_delete) + old_node = container_of(anode, struct vlist_node, avl); + if (tree->keep_old || tree->no_delete) { + old_node->version = tree->version; goto update_only; + } - old_node = container_of(anode, struct vlist_node, avl); avl_delete(&tree->avl, anode); } @@ -70,3 +73,42 @@ vlist_flush_all(struct vlist_tree *tree) tree->version++; vlist_flush(tree); } + + +void +__vlist_simple_init(struct vlist_simple_tree *tree, int offset) +{ + INIT_LIST_HEAD(&tree->list); + tree->version = 1; + tree->head_offset = offset; +} + +void +vlist_simple_delete(struct vlist_simple_tree *tree, struct vlist_simple_node *node) +{ + char *ptr; + + list_del(&node->list); + ptr = (char *) node - tree->head_offset; + free(ptr); +} + +void +vlist_simple_flush(struct vlist_simple_tree *tree) +{ + struct vlist_simple_node *n, *tmp; + + list_for_each_entry_safe(n, tmp, &tree->list, list) { + if (n->version == tree->version) + continue; + + vlist_simple_delete(tree, n); + } +} + +void +vlist_simple_flush_all(struct vlist_simple_tree *tree) +{ + tree->version++; + vlist_simple_flush(tree); +}