diff --git a/include/vieter_tree.h b/include/vieter_tree.h index 2079eb9..4da500f 100644 --- a/include/vieter_tree.h +++ b/include/vieter_tree.h @@ -67,4 +67,22 @@ void vieter_tree_iterator_free(vieter_tree_iterator **ptp); vieter_tree_error vieter_tree_iterator_next(void **out, vieter_tree_iterator *iter); +/* + * Acquire a read lock on the tree. Return value is the result of + * pthread_rwlock_rdlock. + */ +int vieter_tree_rlock(vieter_tree *tree); + +/* + * Acquire a write lock on the tree. Return value is the result of + * pthread_rwlock_wrlock. + */ +int vieter_tree_wlock(vieter_tree *tree); + +/* + * Unlock the lock after having acquired it. Return value is the result of + * pthread_rwlock_unlock. + */ +int vieter_tree_unlock(vieter_tree *tree); + #endif diff --git a/src/tree/vieter_tree.c b/src/tree/vieter_tree.c index 84a1a26..ca6016e 100644 --- a/src/tree/vieter_tree.c +++ b/src/tree/vieter_tree.c @@ -114,3 +114,15 @@ bool vieter_tree_validate(vieter_tree *tree) { return vieter_tree_node_get(tree->root, vieter_tree_node_black) && vieter_tree_node_validate(tree->root, 0, expected_black_nodes); } + +int vieter_tree_rlock(vieter_tree *tree) { + return pthread_rwlock_rdlock(&tree->lock); +} + +int vieter_tree_wlock(vieter_tree *tree) { + return pthread_rwlock_wrlock(&tree->lock); +} + +int vieter_tree_unlock(vieter_tree *tree) { + return pthread_rwlock_unlock(&tree->lock); +} diff --git a/src/tree/vieter_tree_internal.h b/src/tree/vieter_tree_internal.h index 1214572..037345c 100644 --- a/src/tree/vieter_tree_internal.h +++ b/src/tree/vieter_tree_internal.h @@ -1,11 +1,13 @@ #include "vieter_tree.h" #include "vieter_tree_node.h" +#include #include struct vieter_tree { uint64_t size; vieter_tree_node *root; + pthread_rwlock_t lock; }; /*