rculfhash: use node instead of iter argument for deletion
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 21 Dec 2011 13:24:25 +0000 (08:24 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 21 Dec 2011 13:24:25 +0000 (08:24 -0500)
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 <laijs@cn.fujitsu.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
rculfhash.c
tests/test_urcu_hash.c
urcu/rculfhash.h

index f214293196a6094958e8274e09aaf73bb627f276..75e5ece96c9edb3e462b861fe61e682561d7a1c4 100644 (file)
@@ -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;
index 8c6f0dac218a44f30b6bd16211fd0156e8fc3943..eb6cca9381b738279affedab98ceff818c1b2bba 100644 (file)
@@ -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++;
index 6ea00de3557f381bcd7172b7a8260d85e9d54734..b33ede09cfa664388b9f094e78d60a6161936bba 100644 (file)
@@ -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
This page took 0.028169 seconds and 4 git commands to generate.