]> arthur.barton.de Git - netdata.git/blobdiff - src/avl.c
Separate getifaddrs module with simple patterns adopted
[netdata.git] / src / avl.c
index aa45fff44f6afcf17bd8a01a0eca9497666b9fe7..1ec1b8ad221bc31bf4adc8636512a97db9ccbb6f 100644 (file)
--- 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