From: Mathieu Desnoyers Date: Wed, 21 Dec 2011 13:24:25 +0000 (-0500) Subject: rculfhash: use node instead of iter argument for deletion X-Git-Tag: v0.7.0~43^2~8 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=bc8c3c74b84e838b195faa8871344f5b672ae1cd;p=userspace-rcu.git rculfhash: use node instead of iter argument for deletion Using a node instead of an iterator as argument for deletion allows passing a node pointer (that would have been looked up from another data structure, thus not using the iterator) as argument for deletion. Deletion still returns -ENOENT if asked to delete the NULL node. This simplifies the caller usage. Suggested-by: Lai Jiangshan Signed-off-by: Mathieu Desnoyers --- diff --git a/rculfhash.c b/rculfhash.c index f214293..75e5ece 100644 --- a/rculfhash.c +++ b/rculfhash.c @@ -1527,15 +1527,15 @@ int cds_lfht_replace(struct cds_lfht *ht, struct cds_lfht_iter *old_iter, new_node); } -int cds_lfht_del(struct cds_lfht *ht, struct cds_lfht_iter *iter) +int cds_lfht_del(struct cds_lfht *ht, struct cds_lfht_node *node) { unsigned long size, hash; int ret; size = rcu_dereference(ht->size); - ret = _cds_lfht_del(ht, size, iter->node); + ret = _cds_lfht_del(ht, size, node); if (!ret) { - hash = bit_reverse_ulong(iter->node->reverse_hash); + hash = bit_reverse_ulong(node->reverse_hash); ht_count_del(ht, size, hash); } return ret; diff --git a/tests/test_urcu_hash.c b/tests/test_urcu_hash.c index 8c6f0da..eb6cca9 100644 --- a/tests/test_urcu_hash.c +++ b/tests/test_urcu_hash.c @@ -610,7 +610,7 @@ void *thr_writer(void *_count) cds_lfht_test_lookup(test_ht, (void *)(((unsigned long) rand_r(&rand_lookup) % write_pool_size) + write_pool_offset), sizeof(void *), &iter); - ret = cds_lfht_del(test_ht, &iter); + ret = cds_lfht_del(test_ht, cds_lfht_iter_get_node(&iter)); rcu_read_unlock(); if (ret == 0) { node = cds_lfht_iter_get_test_node(&iter); @@ -715,7 +715,7 @@ void test_delete_all_nodes(struct cds_lfht *ht) cds_lfht_for_each_entry(ht, &iter, node, node) { int ret; - ret = cds_lfht_del(test_ht, &iter); + ret = cds_lfht_del(test_ht, cds_lfht_iter_get_node(&iter)); assert(!ret); call_rcu(&node->head, free_node_cb); count++; diff --git a/urcu/rculfhash.h b/urcu/rculfhash.h index 6ea00de..b33ede0 100644 --- a/urcu/rculfhash.h +++ b/urcu/rculfhash.h @@ -354,14 +354,14 @@ int cds_lfht_replace(struct cds_lfht *ht, struct cds_lfht_iter *old_iter, /* * cds_lfht_del - remove node pointed to by iterator from hash table. * @ht: the hash table. - * @iter: the iterator position of the node to delete. + * @node: the node to delete. * * Return 0 if the node is successfully removed, negative value * otherwise. - * Replacing a NULL node or an already removed node will fail with a + * Deleting a NULL node or an already removed node will fail with a * negative value. - * Node can be looked up with cds_lfht_lookup and cds_lfht_next. - * cds_lfht_iter_get_node. + * Node can be looked up with cds_lfht_lookup and cds_lfht_next, + * followed by use of cds_lfht_iter_get_node. * RCU read-side lock must be held between lookup and removal. * Call with rcu_read_lock held. * Threads calling this API need to be registered RCU read-side threads. @@ -369,7 +369,7 @@ int cds_lfht_replace(struct cds_lfht *ht, struct cds_lfht_iter *old_iter, * freeing the memory reserved for old node (which can be accessed with * cds_lfht_iter_get_node). */ -int cds_lfht_del(struct cds_lfht *ht, struct cds_lfht_iter *iter); +int cds_lfht_del(struct cds_lfht *ht, struct cds_lfht_node *node); /* * cds_lfht_resize - Force a hash table resize