summaryrefslogtreecommitdiffstats
path: root/lib/eu-search.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/eu-search.c')
-rw-r--r--lib/eu-search.c57
1 files changed, 42 insertions, 15 deletions
diff --git a/lib/eu-search.c b/lib/eu-search.c
index a6b04f4f..c952c113 100644
--- a/lib/eu-search.c
+++ b/lib/eu-search.c
@@ -30,31 +30,58 @@
#include <config.h>
#endif
-#include <stdlib.h>
#include "eu-search.h"
-rwlock_define(static, search_find_lock);
+#include <stdio.h>
-void *eu_tsearch(const void *key, void **rootp,
- int (*compar)(const void *, const void *))
+void *eu_tsearch (const void *key, search_tree *tree,
+ int (*compare)(const void *, const void *))
{
- void *ret = NULL;
- rwlock_wrlock(search_find_lock);
+ rwlock_wrlock (tree->lock);
+ void *ret = tsearch (key, &tree->root, compare);
+ rwlock_unlock (tree->lock);
- ret = tsearch(key, rootp, compar);
-
- rwlock_unlock(search_find_lock);
return ret;
}
-void *eu_tfind(const void *key, void *const *rootp,
- int (*compar)(const void *, const void *))
+void *eu_tfind (const void *key, search_tree *tree,
+ int (*compare)(const void *, const void *))
{
- void *ret = NULL;
- rwlock_rdlock(search_find_lock);
+ rwlock_rdlock (tree->lock);
+ void *ret = tfind (key, &tree->root, compare);
+ rwlock_unlock (tree->lock);
+
+ return ret;
+}
- ret = tfind(key, rootp, compar);
+void *eu_tdelete (const void *key, search_tree *tree,
+ int (*compare)(const void *, const void *))
+{
+ rwlock_wrlock (tree->lock);
+ void *ret = tdelete (key, &tree->root, compare);
+ rwlock_unlock (tree->lock);
- rwlock_unlock(search_find_lock);
return ret;
}
+
+void eu_tdestroy (search_tree *tree, void (*free_node)(void *))
+{
+ rwlock_wrlock (tree->lock);
+
+ tdestroy (tree->root, free_node);
+ tree->root = NULL;
+
+ rwlock_unlock (tree->lock);
+}
+
+void eu_search_tree_init (search_tree *tree)
+{
+ tree->root = NULL;
+ rwlock_init (tree->lock);
+}
+
+void eu_search_tree_fini (search_tree *tree, void (*free_node)(void *))
+{
+ eu_tdestroy (tree, free_node);
+ rwlock_fini (tree->lock);
+}