X-Git-Url: https://arthur.barton.de/gitweb/?a=blobdiff_plain;f=src%2Favl.c;h=1ec1b8ad221bc31bf4adc8636512a97db9ccbb6f;hb=e86fe357adb9fb88f8e83950c52efaf95800a5ac;hp=aa45fff44f6afcf17bd8a01a0eca9497666b9fe7;hpb=c50ec4efef94710302a2da98b78d8a2bfc567c35;p=netdata.git diff --git a/src/avl.c b/src/avl.c index aa45fff4..1ec1b8ad 100644 --- a/src/avl.c +++ b/src/avl.c @@ -278,7 +278,39 @@ avl *avl_remove(avl_tree *tree, avl *item) { } /* ------------------------------------------------------------------------- */ -// these functions are (C) Costa Tsaousis +// below are functions by (C) Costa Tsaousis + +// --------------------------- +// traversing + +int avl_walker(avl *node, int (*callback)(void *entry, void *data), void *data) { + int total = 0, ret = 0; + + if(node->avl_link[0]) { + ret = avl_walker(node->avl_link[0], callback, data); + if(ret < 0) return ret; + total += ret; + } + + ret = callback(node, data); + if(ret < 0) return ret; + total += ret; + + if(node->avl_link[1]) { + ret = avl_walker(node->avl_link[1], callback, data); + if (ret < 0) return ret; + total += ret; + } + + return total; +} + +int avl_traverse(avl_tree *t, int (*callback)(void *entry, void *data), void *data) { + return avl_walker(t->root, callback, data); +} + +// --------------------------- +// locks void avl_read_lock(avl_tree_lock *t) { #ifndef AVL_WITHOUT_PTHREADS @@ -310,7 +342,8 @@ void avl_unlock(avl_tree_lock *t) { #endif /* AVL_WITHOUT_PTHREADS */ } -/* ------------------------------------------------------------------------- */ +// --------------------------- +// operations with locking void avl_init_lock(avl_tree_lock *t, int (*compar)(void *a, void *b)) { avl_init(&t->avl_tree, compar); @@ -351,8 +384,17 @@ avl *avl_insert_lock(avl_tree_lock *t, avl *a) { return ret; } +int avl_traverse_lock(avl_tree_lock *t, int (*callback)(void *entry, void *data), void *data) { + int ret; + avl_read_lock(t); + ret = avl_traverse(&t->avl_tree, callback, data); + avl_unlock(t); + return ret; +} + void avl_init(avl_tree *t, int (*compar)(void *a, void *b)) { t->root = NULL; t->compar = compar; } +// ------------------ \ No newline at end of file