6 avl_strcmp(const void *k1, const void *k2, void *ptr)
12 __vlist_init(struct vlist_tree *tree, avl_tree_comp cmp,
13 vlist_update_cb update, int offset)
15 tree->key_offset = offset;
16 tree->update = update;
19 avl_init(&tree->avl, cmp, 0, tree);
23 vlist_delete(struct vlist_tree *tree, struct vlist_node *node)
26 avl_delete(&tree->avl, &node->avl);
27 tree->update(tree, NULL, node);
31 vlist_add(struct vlist_tree *tree, struct vlist_node *node)
33 struct vlist_node *old_node = NULL;
34 struct avl_node *anode;
35 void *key = (char *) node + tree->key_offset;
38 node->version = tree->version;
40 anode = avl_find(&tree->avl, key);
42 old_node = container_of(anode, struct vlist_node, avl);
43 if (tree->keep_old || tree->no_delete)
46 avl_delete(&tree->avl, anode);
49 avl_insert(&tree->avl, &node->avl);
52 tree->update(tree, node, old_node);
56 vlist_flush(struct vlist_tree *tree)
58 struct vlist_node *node, *tmp;
60 avl_for_each_element_safe(&tree->avl, node, avl, tmp) {
61 if (node->version == tree->version)
64 vlist_delete(tree, node);
69 vlist_flush_all(struct vlist_tree *tree)
77 __vlist_simple_init(struct vlist_simple_tree *tree, int offset)
79 INIT_LIST_HEAD(&tree->list);
81 tree->head_offset = offset;
85 vlist_simple_delete(struct vlist_simple_tree *tree, struct vlist_simple_node *node)
89 list_del(&node->list);
90 ptr = (char *) node - tree->head_offset;
95 vlist_simple_flush(struct vlist_simple_tree *tree)
97 struct vlist_simple_node *n, *tmp;
99 list_for_each_entry_safe(n, tmp, &tree->list, list) {
100 if (n->version == tree->version)
103 vlist_simple_delete(tree, n);
108 vlist_simple_flush_all(struct vlist_simple_tree *tree)
111 vlist_simple_flush(tree);