X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fsplay_tree.c;h=50d701c9c4b74ceebfe2fb9485bc6ef2ac4b3611;hb=72091d5c770856870bb8cd51bcc5641078c7562c;hp=2b6186ff07dc8a5e486e2b2e4b83fcba3ab08ad7;hpb=f6e87ab476a0faf8b124ecaaa27f967d825e6457;p=tinc diff --git a/src/splay_tree.c b/src/splay_tree.c index 2b6186ff..50d701c9 100644 --- a/src/splay_tree.c +++ b/src/splay_tree.c @@ -25,7 +25,7 @@ /* Splay operation */ static splay_node_t *splay_top_down(splay_tree_t *tree, const void *data, int *result) { - splay_node_t left = {NULL}, right = {NULL}; + splay_node_t left = {0}, right = {0}; splay_node_t *leftbottom = &left, *rightbottom = &right, *child, *grandchild; splay_node_t *root = tree->root; int c; @@ -463,6 +463,7 @@ void splay_insert_top(splay_tree_t *tree, splay_node_t *node) { node->prev = node->next = node->left = node->right = node->parent = NULL; tree->head = tree->tail = tree->root = node; tree->count++; + tree->generation++; } void splay_insert_before(splay_tree_t *tree, splay_node_t *before, splay_node_t *node) { @@ -500,6 +501,7 @@ void splay_insert_before(splay_tree_t *tree, splay_node_t *before, splay_node_t node->parent = NULL; tree->root = node; tree->count++; + tree->generation++; } void splay_insert_after(splay_tree_t *tree, splay_node_t *after, splay_node_t *node) { @@ -537,6 +539,7 @@ void splay_insert_after(splay_tree_t *tree, splay_node_t *after, splay_node_t *n node->parent = NULL; tree->root = node; tree->count++; + tree->generation++; } splay_node_t *splay_unlink(splay_tree_t *tree, void *data) { @@ -581,6 +584,7 @@ void splay_unlink_node(splay_tree_t *tree, splay_node_t *node) { } tree->count--; + tree->generation++; } void splay_delete_node(splay_tree_t *tree, splay_node_t *node) { @@ -600,12 +604,21 @@ void splay_delete(splay_tree_t *tree, void *data) { /* Fast tree cleanup */ -void splay_delete_tree(splay_tree_t *tree) { +void splay_empty_tree(splay_tree_t *tree) { for(splay_node_t *node = tree->head, *next; node; node = next) { next = node->next; splay_free_node(tree, node); } + tree->head = NULL; + tree->tail = NULL; + tree->root = NULL; + tree->count = 0; + tree->generation++; +} + +void splay_delete_tree(splay_tree_t *tree) { + splay_empty_tree(tree); splay_free_tree(tree); }